opencv 3.0 Mat 資料型別轉換
阿新 • • 發佈:2019-02-02
opencv 3.0將 Mat 向 CvMat CvMatND IplImage 的轉化,都去除了
// //! converts header to CvMat; no data is copied // operator CvMat() const; // //! converts header to CvMatND; no data is copied // operator CvMatND() const; // //! converts header to IplImage; no data is copied // operator IplImage() const;
詳見mat.hpp 的 line 798 - 803
關於 *buf -> Mat 轉換
我們不禁想問,那如何實現從 快取到矩陣的轉換呢?
自己寫咯。。。其實用不著
因為在mat.hpp 的 line 661 - 664
//! constructor for matrix headers pointing to user-allocated data Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP); Mat(Size size, int type, void* data, size_t step=AUTO_STEP); Mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0);
可見,我們可以使用建構函式完成對外部的快取的資料的Mat格式封裝。
不多說,上程式碼。
注意:Mat只是資料頭的記錄,若要硬拷貝 需要使用clone()。
void MatTest() { const char *imagename = "E:/1.jpg"; uchar *buf, *src; Mat img = imread(imagename); buf = new uchar[img.total()*img.elemSize()]; src = img.data; //產生一個buffer,包含影象資訊 for (int i=0; i< img.cols; i++ ) { for (int j=0;j< img.rows; j++) { buf[3*(img.cols*j + i)] = src[3*(img.cols*j + i)]; buf[3*(img.cols*j + i)+1] = src[3*(img.cols*j + i)+1]; buf[3*(img.cols*j + i)+2] = src[3*(img.cols*j + i)+2]; } } //對buffer軟拷貝 Mat ans1(img.rows, img.cols, CV_8UC3, buf); //對buffer硬拷貝 Mat ans2 = Mat(img.rows, img.cols, CV_8UC3, buf).clone(); imshow("image", img); //顯示影象 imshow("ans1", ans1); imshow("ans2", ans2); waitKey(); }