【Opencv】 Mat与vector互转 数据类型转换 --Mat与Vector<Point2f>

1 数据类型转换–

1.1 Mat -->Vector<Point2f>

Mat m;
vector<Point3f> p;
p=Mat_<Point3f>(m)

1.2 vector<Point3f> --> Mat

vector<Point3f> p;
Mat m=Mat(p);

1.3 vector<Point3f> --> vector<vector<Point3f>

vector<Point3f> p1,p2,p3;
vector<vectoe<Point3f>> pp;
pp.pushback(p1);
pp.pushback(p2);
pp.pushback(p3);

1.4 vector<vector<Point3f> --> Mat

vector<vector<Point3f>> p;  
Mat pm((int)p.size(), p[0].size(), CV_32FC3);  
  
for( int i = 0; i < (int)p.size(); i++ )  
{  
    Mat r = pm.row(i).reshape(3, pm.cols);  
    Mat pm1(p[i]);  
    pm1.copyTo(r);  
}  

2 Opencv实现Mat与vector互转

2.1 Mat与vector互转

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

/***************** Mat转vector **********************/
template<typename _Tp>
vector<_Tp> convertMat2Vector(const Mat &mat)
{
	return (vector<_Tp>)(mat.reshape(1, 1));//通道数不变,按行转为一行
}

/****************** vector转Mat *********************/
template<typename _Tp>
cv::Mat convertVector2Mat(vector<_Tp> v, int channels, int rows)
{
	cv::Mat mat = cv::Mat(v);//将vector变成单列的mat
	cv::Mat dest = mat.reshape(channels, rows).clone();//PS:必须clone()一份,否则返回出错
	return dest;
}


int main()
{
	/* char ->CV_8SC
	* unsigned char,uchar ->CV_8UC
	* unsigned short int,ushort->CV_16UC
	* short int->CV_16SC
	* int   ->CV_32SC
	* float ->CV_32FC
	* double->CV_64FC
	*/
    Mat srcDate=Mat(3,3,CV_32FC3,Scalar(2));

	vector<float> v = convertMat2Vector<float>(srcDate);
	cv::Mat dest = convertVector2Mat<float>(v, 3, 3);//把数据转为3通道,3行的Mat数据
	cout << "dest=\n" << dest << endl;

	system("pause");
	waitKey();
	return 0;
}

2.2 Mat与数组互转

使用Mat存储数据,并读取相应元素

    Mat mean = (cv::Mat_<float>(2, 1) << 0.4404, 0.3111);
	cout << "mean=" << mean << endl;
	float a = mean.at<float>(0, 0);
	float b = mean.at<float>(1, 0);

将数组内容传递给Mat

unsigned char cbuf[height][width];
cv::Mat img(height, width, CV_8UC1, (unsigned char*)cbuf);

3 pp和output的区别

pp和output的区别在于pp是vector<vector<Point3f>>而output是vector<Point3f>

#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
    //定义3*1的矩阵m1、m2、m3
	Mat m1 = Mat(3, 1, CV_32F, Scalar(1));
	Mat m2 = Mat(3, 1, CV_32F, Scalar(2));
	Mat m3 = Mat(3, 1, CV_32F, Scalar(3));

    //把Mat数组转换成Point3f点
	vector<Point3f> p1;
	p1 = Mat_<Point3f>(m1);
	vector<Point3f> p2;
	p2 = Mat_<Point3f>(m2);
	vector<Point3f> p3;
	p3 = Mat_<Point3f>(m3);

    //把Point3f点放入pp中
	vector<vector<Point3f>> pp;
	pp.push_back(p1);
	pp.push_back(p2);
	pp.push_back(p3);
	cout << pp[0] << endl;
	
	//先把m1m2m3转换成Point3f然后存储在vector<Point3f>中
	vector<Point3f> output;
	output.push_back(Point3f(m1.at<Point3f>(0, 0)));
	output.push_back(Point3f(m2.at<Point3f>(0, 0)));
	output.push_back(Point3f(m3.at<Point3f>(0, 0)));
	cout << output << endl;
	
}

数据类型转换–Mat与Vector<Point2f>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
//显示结果 imshow("轮廓绘制结果", edge); vector<Point2f>point_0; vector<Point2f>point_1; vector<Point2f>point_2; vector<Point2f>point_3; vector<Point2f>point_4; vector<Point2f>point_5; vector<Point2f>point_6; vector<Point2f>point_7; vector<Point2f>point_8; vector<Point2f>point_9; vector<Point2f>point_10; vector<Point2f>point_11; vector<Point2f>point_12; vector<Point2f>point_13; vector<Point2f>point_14; vector<Point2f>point_15; vector<Point2f>point_16; vector<Point2f>point_17; vector<Point2f>point_18; vector<Point2f>point_19; int m, n; for (m = 0; m < contours.size(); m++) { for (n = 0; n < contours[m].size(); n++) { switch (m) { case 0: point_0.push_back(contours[m][n]); break; case 1: point_1.push_back(contours[m][n]); break; case 2: point_2.push_back(contours[m][n]); break; case 3: point_3.push_back(contours[m][n]); break; case 4: point_4.push_back(contours[m][n]); break; case 5: point_5.push_back(contours[m][n]); break; case 6: point_6.push_back(contours[m][n]); break; case 7: point_7.push_back(contours[m][n]); break; case 8: point_8.push_back(contours[m][n]); break; case 9: point_9.push_back(contours[m][n]); break; case 10: point_10.push_back(contours[m][n]); break; case 11: point_11.push_back(contours[m][n]); break; case 12: point_12.push_back(contours[m][n]); break; case 13: point_13.push_back(contours[m][n]); break; case 14: point_14.push_back(contours[m][n]); break; case 15: point_15.push_back(contours[m][n]); break; case 16: point_16.push_back(contours[m][n]); break; case 17: point_17.push_back(contours[m][n]); break; case 18: point_18.push_back(contours[m][n]); break; case 19: point_19.push_back(contours[m][n]); break; default: cout << "input error" << endl; } } } Mat img(321, 432, CV_8UC1, cv::Scalar(0));
05-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值