我正在编写一个使用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;
答案 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));
}
}