我正在使用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元素时,我可以看到第一个元素不是基础数据,而是轮廓点的总数。
任何有关正确方法的帮助。
答案 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
使用Point
。int
使用Point2f
)。如果您想要2列单通道矩阵,可以使用float
:
reshape
如果您想转换为Mat m3 = m2.reshape(1);
类型,则需要使用float
:
convertTo
这里有一些工作代码作为概念证明:
Mat m4;
m2.convertTo(m4, CV_32F);