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

一、数据转换

1、Mat——>vector<Point3f>:

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

2、vector<Point3f> ——> Mat:

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

3、vector<Point3f> ——> vector<vector<Point3f>>

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

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

二、Opencv实现Mat与vector互转

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、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);

三、

ppoutput的区别在于:ppvector<vector<Point3f>>outputvector<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;
	
}
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值