Mat 的幾種初始化和賦值方法
阿新 • • 發佈:2018-10-16
cto 轉換 -m mat tro sha 數據 return main 由
由
數據中的類型自動選擇通道數與數據類型。
這幾天用到了由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。
#include <opencv2/opencv.hpp> #include <iostream> #include <vector> int main() { ////////////////////////////////////////////////////////////////////////// // cv::Point --> cv::Mat 可以使用cv::Mat_<cv::Point3f>, 或初始化時{}賦值 // vector<float> --> cv:Mat 可以使用{}賦值 cv::Point3f v1(34.0f, 21.34f, 32.0f); // 1. cv::Mat_<cv::Point3f> // 三種賦值方式可以實現由Point3f到Mat的轉換, 但是通道數不是1 //cv::Mat m1 = cv::Mat_<cv::Point3f>(v1); cv::Mat m1{ cv::Mat_<cv::Point3f>(v1) }; //cv::Mat_<cv::Point3f>(v1).assignTo(m1); std::cout << "m1: " << m1 << "\tchannels: " << m1.channels() << "\tsize(width x height): " << m1.size() << "\n"; m1 = m1.reshape(1); std::cout << "m1: " << m1 << "\tchannels: " << m1.channels() << "\tsize(width x height): " << m1.size() << "\n"; // 2. cv::Mat{v1} cv::Mat m2{ v1 }; //cv::Mat m2; //m2 = cv::Mat(v1); //cv::Mat(v1).copyTo(m2); std::cout << "m2.t(): " << m2.t() << "\tchannels: " << m2.channels() << "\tsize(width x height): " << m2.size() << "\n"; // 3. vector<*> --> Mat 自動選擇類型 std::vector<double> vec{ 21.3, -10, 34.0, 3.2, 3.4 }; cv::Mat m3{ vec }; std::cout << "m3.t(): " << m2.t() << "\tchannels: " << m3.channels() << "\tsize(width x height): " << m3.size() << "\ttype: " << m3.type() << "\n" ; std::vector<uchar> uvec{ 2, 9, 29 }; cv::Mat m4{ uvec }; std::cout << "m4.t(): " << m4.t() << "\tchannels: " << m4.channels() << "\tsize(width x height): " << m4.size() << "\ttype: " << m4.type() << "\n"; std::vector<cv::Point2f> vecpts{ cv::Point2f(2.3, 3.1), cv::Point2f(9.3, -10.0) }; cv::Mat m5{ vecpts }; std::cout << "m5: " << m5 << "\tchannels: " << m5.channels() << "\tsize(width x height): " << m5.size() << "\ttype: " << m5.type() << "\n"; return 0; }
運行結果如圖:
Mat 的幾種初始化和賦值方法