将轮廓点矢量复制到垫子中

时间:2017-03-12 19:10:52

标签: opencv vector point mat

我正在使用OpenCV 3.1和VS2012 C ++ / CLI。

我已将finContours调用的结果存储到:

std::vector<std::vector<Point>> Contours;

因此,Contours [0]是第一轮廓的轮廓点的矢量。 轮廓[1]是第二个矢量等的轮廓点的矢量。

现在,我想将其中一个轮廓加载到基于Convert Mat to vector <float> and Vector<float> to mat in opencv的Mat中。我认为这样的东西会起作用。

Mat testMat=Mat(Images->Contours[0].size(),2,CV_32FC1);    
memcpy(testMat.data,Images->Contours[0].data(),Images->Contours[0].size()*CV_32FC1);

我指定了两列,因为我每个底层品脱必须由X点和Y点组成,每一列都应该是一个浮点数。但是,当我访问Mat元素时,我可以看到第一个元素不是基础数据,而是轮廓点的总数。

任何有关正确方法的帮助。

1 个答案:

答案 0 :(得分:2)

你可以这样做:

Mat testMat = Mat(Images->Contours[0]).reshape(1);

现在testMat的类型为CV_32SC1,又称int。如果您需要float,您可以:

testMat.convertTo(testMat, CV_32F);

更多细节和变体......

您只需使用接受Mat的{​​{1}}构造函数:

std::vector

通过这种方式,您可以在vector<Point> v = { {0,1}, {2,3}, {4,5} }; Mat m(v); 中获得包含基础数据的2通道矩阵。这意味着,如果您更改v中的值,v中的值也会更改。

m

如果您想要值的副本,那么v[0].x = 7; // also 'm' changes 中的更改不会反映在v中,您可以使用m

clone

您的矩阵属于Mat m2 = Mat(v).clone(); 类型,即CV_32SC2的2个频道矩阵(因为int使用Pointint使用Point2f )。如果您想要2列单通道矩阵,可以使用float

reshape

如果您想转换为Mat m3 = m2.reshape(1); 类型,则需要使用float

convertTo

这里有一些工作代码作为概念证明:

Mat m4;
m2.convertTo(m4, CV_32F);