Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 将等高线点的矢量复制到Mat中_Opencv_Vector_Point_Mat - Fatal编程技术网

Opencv 将等高线点的矢量复制到Mat中

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

我将OpenCV 3.1与VS2012 C++/CLI一起使用

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

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