1. 程式人生 > >opencv 3.0 Mat 資料型別轉換

opencv 3.0 Mat 資料型別轉換

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