Opencv 将等高线点的矢量复制到Mat中
我将OpenCV 3.1与VS2012 C++/CLI一起使用 我已将调用的结果存储到:Opencv 将等高线点的矢量复制到Mat中,opencv,vector,point,mat,Opencv,Vector,Point,Mat,我将OpenCV 3.1与VS2012 C++/CLI一起使用 我已将调用的结果存储到: std::vector<std::vector<Point>> Contours; 我指定了两列,因为每个基础品脱都必须由X点和Y点组成,并且每个都应该是浮点。但是,当我访问Mat元素时,我可以看到第一个元素不是基础数据,而是轮廓点的总数 有关实现此目标的正确方法的任何帮助,请参阅。您可以通过以下方式实现: Mat testMat = Mat(Images->Contours
std::vector<std::vector<Point>> Contours;
我指定了两列,因为每个基础品脱都必须由X点和Y点组成,并且每个都应该是浮点。但是,当我访问Mat元素时,我可以看到第一个元素不是基础数据,而是轮廓点的总数
有关实现此目标的正确方法的任何帮助,请参阅。您可以通过以下方式实现:
Mat testMat = Mat(Images->Contours[0]).reshape(1);
现在,testMat
的类型是CV_32SC1
,也称为int
。如果您需要浮动
,您可以:
testMat.convertTo(testMat, CV_32F);
更多细节和变体 只需使用接受
std::vector
的Mat
构造函数即可:
vector<Point> v = { {0,1}, {2,3}, {4,5} };
Mat m(v);
如果您需要值的深度副本,以便v
中的更改不会反映在m
中,则可以使用clone
:
Mat m2 = Mat(v).clone();
您的矩阵类型为cv32sc2
,即int
的两个通道矩阵(因为点使用int
。对于浮点,使用点2f
)。如果需要2列单通道矩阵,可以使用重塑
:
Mat m3 = m2.reshape(1);
如果要转换为float
类型,则需要使用convertTo
:
Mat m4;
m2.convertTo(m4, CV_32F);
这里有一些工作代码作为概念证明:
#include <opencv2\opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;
int main()
{
vector<Point> v = { {0,1}, {2,3}, {4,5} };
// changes in v affects m
Mat m(v);
// changes in v doesn't affect m2
Mat m2 = Mat(v).clone();
// m is changed
v[0].x = 7;
// m3 is a 2 columns single channel matrix
Mat m3 = m2.reshape(1);
// m4 is a matrix of floats
Mat m4;
m2.convertTo(m4, CV_32F);
return 0;
}
#包括
#包括
使用名称空间std;
使用名称空间cv;
int main()
{
向量v={0,1},{2,3},{4,5};
//v的变化影响m
matm(v);
//v的变化不影响m2
Mat m2=Mat(v).clone();
//m变了
v[0].x=7;
//m3是一个2列单通道矩阵
材料m3=m2。重塑(1);
//m4是浮点数矩阵
Mat m4;
m2.转换器(m4,CV_32F);
返回0;
}
Mat m4;
m2.convertTo(m4, CV_32F);
#include <opencv2\opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;
int main()
{
vector<Point> v = { {0,1}, {2,3}, {4,5} };
// changes in v affects m
Mat m(v);
// changes in v doesn't affect m2
Mat m2 = Mat(v).clone();
// m is changed
v[0].x = 7;
// m3 is a 2 columns single channel matrix
Mat m3 = m2.reshape(1);
// m4 is a matrix of floats
Mat m4;
m2.convertTo(m4, CV_32F);
return 0;
}