有效地转换来自opencv的数据

Convert data from opencv effectively

本文关键字:数据 opencv 转换 有效地      更新时间:2023-10-16

我正在编写一个同时使用OpenCV和Kinect v2 SDK的程序,在那里我遇到了一个尴尬的问题。我获得了 Point2i(类由 int X,Y 组成)的向量作为像素的索引,我需要将其转换为 depthSpacePoint(由 float32 X,Y 组成的结构),它只是 depthSpacePoints.X = Point2i.X;或者相反。

元素太多了,写一个 for 循环会太慢。

所以我想知道是否有任何像memcpy或其他方法可以更快地完成它?

以下是我的代码摘要:

cv::findnonZeros(Mat A, vector<cv::Point2i> B);
vector<depthSpacePoint> C(B.size());
for(int i= 0; i < B.size(); ++i){
C[i].X = b[i].x;
C[i].Y = B[i].y;
}
icoordinateMapper(C.size(),C,...,...); 

<-这就是我转换它的原因,因为这个库函数只采用自己的数据类型depthSpacePoint;>

您可以实现自己的直接创建std::vector<depthSpacePoint>cv::findNonZero版本。

这只是扫描(有效)矩阵并检查条件的问题。

void findNonZeroSpacePoints( InputArray _src, std::vector<depthSpacePoint>& pts )
{
    // Get the src matrix, be sure it's of correct type
    Mat src = _src.getMat();
    CV_Assert( src.type() == CV_8UC1 );        
    // If src is all zero, return
    int n = countNonZero(src);
    if(n == 0) {
        pts.clear();
        return;
    }
    // Allocate pts
    pts.resize(n);        
    // Efficiently scan matrix and append points
    depthSpacePoint* ppts = pts.data();
    for( int i = 0; i < src.rows; i++ )
    {
        const uchar* bin_ptr = src.ptr(i);
        for( int j = 0; j < src.cols; j++ )
            if( bin_ptr[j] )
                *ppts ++ = depthSpacePoint(float(j), float(i));
    }
}