OpenCV 笔记(08)— 二维点、三维点、基于 Mat 的 std::vector 等常用数据结构的定义和输出

1. 定义和输出二维点

	Point2f p2(3, 4);
	cout << "[二维点] is "<< endl << p2 << endl;

输出结果:

[二维点] is 
[3, 4]

2. 定义和输出三维点

	Point3f p3(3, 4, 2);
	cout << "[三维点] is "<< endl << p3 << endl;

输出结果:

[三维点] is 
[3, 4, 2]

3. 定义和输出基于 Mat 的 std::vector

是基于 Mat 类的 std::vector 的定义和输出方法:

	vector<float> v;
	v.push_back(1);
	v.push_back(3);
	v.push_back(5);
	cout << "[基于Mat的vector] is "<< endl << Mat(v) << endl;

输出结果:

[基于Mat的vector] is 
[1;
 3;
 5]

4. 定义和输出 std::vector 点

定义和输出存放着点的 vector 容器,以存放二维点 Point2f 为例:

	vector<Point2f> points(10);
	for(size_t i=0; i<points.size(); i++)
	{
		points[i] = Point2f((float)(i*5), (float)(i%3));
	}
	cout << "[二维点向量] is "<< endl << points << endl;

输出结果:

[二维点向量] is 
[0, 0;
 5, 1;
 10, 2;
 15, 0;
 20, 1;
 25, 2;
 30, 0;
 35, 1;
 40, 2;
 45, 0]

5. 完整代码

#include <iostream>
#include "opencv2/opencv.hpp"

using namespace cv;	
using namespace std;

int main()
{
	Point2f p2(3, 4);
	cout << "[二维点] is "<< endl << p2 << endl;

	Point3f p3(3, 4, 2);
	cout << "[三维点] is "<< endl << p3 << endl;

	vector<float> v;
	v.push_back(1);
	v.push_back(3);
	v.push_back(5);
	cout << "[基于Mat的vector] is "<< endl << Mat(v) << endl;

	vector<Point2f> points(10);
	for(size_t i=0; i<points.size(); i++)
	{
		points[i] = Point2f((float)(i*5), (float)(i%3));
	}
	cout << "[二维点向量] is "<< endl << points << endl;
	return 0;
}
在C++,可以使用模板方法来实现cv::Matstd::vector之间的相互转换。具体的实现代码如下: ``` template<typename _Tp> std::vector<_Tp> convert_mat_to_vector(const cv::Mat& mat) { // 通道数不变,按行转为一行 return (std::vector<_Tp>)(mat.reshape(1, 1)); } template<typename _Tp> cv::Mat convert_vector_to_mat(std::vector<_Tp> v, int channels, int rows) { // 将vector变成单列的mat,这里需要clone(),因为这里的赋值操作是浅拷贝 cv::Mat mat = cv::Mat(v).clone(); cv::Mat dest = mat.reshape(channels, rows); return dest; } ``` 上述代码定义了两个模板方法,分别为convert_mat_to_vector和convert_vector_to_mat。convert_mat_to_vector方法将cv::Mat转换为std::vector,而convert_vector_to_mat方法将std::vector转换为cv::Mat。使用这些方法可以实现cv::Matstd::vector之间的相互转换。 注意:在转换过程,需要确保通道数和行数的正确性。在转换cv::Matstd::vector时,使用reshape方法将多通道的cv::Mat转为一行;在转换std::vector为cv::Mat时,使用reshape方法将一行的std::vector转为指定的通道数和行数。 希望对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [OpenCV - cv::Mat与unsigned char*数组或者float*数组相互转换,cv::Matstd::vector的相互转换](https://blog.csdn.net/HW140701/article/details/131064164)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [opencv matstd::vector互转](https://blog.csdn.net/qq_61862078/article/details/128883907)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wohu007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值