这几天用到了由cv::Point3f和std::vector<float>到cv::Mat数据类型的转换。本质上就是换一下容器。今晚做个小总结。
由Point3f 到 Mat
有两种方法,一种使用cv::Mat_<cv::Point3f>(),另一种是在声明时使用{}初始化。**注意:**第一种方法得到的Mat的数据类型的通道数不为1,需要使用reshape()函数,第二种方式得到的通道数为1。
由vector<float> 到 Mat
比较简单的方法是在Mat声明时,使用{}初始化。或者使用cv::Mat(std::vector<float>)进行赋值也可以。比较省心的是,OpenCV根据vector数据中的类型自动选择通道数与数据类型。
若为uchar, float, double, 则通道数则为1, 若为cv::Point2f, cv::Point3f,则通道数则为2, 3。
1#include <opencv2/opencv.hpp> 2#include <iostream> 3#include <vector> 4 5int main() 6{ 7 ////////////////////////////////////////////////////////////////////////// 8 // cv::Point --> cv::Mat 可以使用cv::Mat_<cv::Point3f>, 或初始化时{}赋值 9 // vector<float> --> cv:Mat 可以使用{}赋值 10 cv::Point3f v1(34.0f, 21.34f, 32.0f); 11 12 // 1. cv::Mat_<cv::Point3f> 13 // 三种赋值方式可以实现由Point3f到Mat的转换, 但是通道数不是1 14 //cv::Mat m1 = cv::Mat_<cv::Point3f>(v1); 15 cv::Mat m1{ cv::Mat_<cv::Point3f>(v1) }; 16 //cv::Mat_<cv::Point3f>(v1).assignTo(m1); 17 18 std::cout << "m1: " << m1 << "\tchannels: " << m1.channels() << "\tsize(width x height): " << m1.size() << "\n"; 19 m1 = m1.reshape(1); 20 std::cout << "m1: " << m1 << "\tchannels: " << m1.channels() << "\tsize(width x height): " << m1.size() << "\n"; 21 22 // 2. cv::Mat{v1} 23 cv::Mat m2{ v1 }; 24 //cv::Mat m2; 25 //m2 = cv::Mat(v1); 26 //cv::Mat(v1).copyTo(m2); 27 std::cout << "m2.t(): " << m2.t() << "\tchannels: " << m2.channels() << "\tsize(width x height): " << m2.size() << "\n"; 28 29 // 3. vector<*> --> Mat 自动选择类型 30 std::vector<double> vec{ 21.3, -10, 34.0, 3.2, 3.4 }; 31 cv::Mat m3{ vec }; 32 std::cout << "m3.t(): " << m2.t() << "\tchannels: " << m3.channels() << "\tsize(width x height): " << m3.size() << "\ttype: " << m3.type() << "\n" ; 33 34 std::vector<uchar> uvec{ 2, 9, 29 }; 35 cv::Mat m4{ uvec }; 36 std::cout << "m4.t(): " << m4.t() << "\tchannels: " << m4.channels() << "\tsize(width x height): " << m4.size() << "\ttype: " << m4.type() << "\n"; 37 38 std::vector<cv::Point2f> vecpts{ cv::Point2f(2.3, 3.1), cv::Point2f(9.3, -10.0) }; 39 cv::Mat m5{ vecpts }; 40 std::cout << "m5: " << m5 << "\tchannels: " << m5.channels() << "\tsize(width x height): " << m5.size() << "\ttype: " << m5.type() << "\n"; 41 return 0; 42}
运行结果如图: 