有效地从opencv转换数据

时间:2017-01-13 08:41:18

标签: c++ opencv

我正在编写一个使用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,...,...); 

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

1 个答案:

答案 0 :(得分:1)

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

只需扫描(efficiently)矩阵并检查条件即可。

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));
    }
}