Dlib筆記二:matrix或array2d與cv::Mat的互轉

由於常常習慣的用OpenCV來作圖像處理,因此不免但願將其餘庫的圖像數據與OpenCV互轉,因此今天就記錄下這種互轉的方法。函數

一、dlib::matrix/dlib::array2d轉cv::Mat

前面說了,定義好一個matrix或者array2d的變量後,是能夠經過nr()和nc()函數來獲取圖像的高度和寬度(行數和列數),而後咱們能夠經過image_data()來獲取數據指針,這個時候要注意,image_data()返回的是void*類型的指針,因此要注意在使用的時候要轉爲相應的數據類型。而後再構造cv::Mat的時候就調用cv::Mat的構造函數來構造便可。cv::Mat的有一個構造函數是:spa

inline Mat::Mat(int _rows, int _cols, int _type, void* _data, size_t _step)
    : flags(MAGIC_VAL + (_type & TYPE_MASK)), 
      dims(2), 
      rows(_rows), 
      cols(_cols),
      data((uchar*)_data), 
      datastart((uchar*)_data), 
      dataend(0), 
      datalimit(0),
      allocator(0), 
      u(0), 
      size(&rows)

對於三通道的matrix或者array2d,要轉成cv::Mat的時候要考慮是否是bgr_pixel,若是是,那就直接轉,若是不是,要先轉爲bgr_pixel而後再轉;若是是灰度圖,那就能夠直接轉換了。以matrix爲例子,array2d是同樣的操做,代碼大體是這樣的:指針

// rgb_pixel/hsi_pixel/lab_pixel
matrix<rgb_pixel> dMat;
load_image(dMat, img_path);
matrix<bgr_pixel> dMat_;
assign_image(dMat_, dMat);
uchar *ptrMat = (uchar *)image_data(dMat_);
cv::Mat cMat = cv::Mat(dMat_.nr(), dMat_.nc(), CV_8UC3, ptrMat);

// bgr_pixel
matrix<bgr_pixel> dMat;
load_image(dMat, img_path);
uchar *ptrMat = (uchar *)image_data(dMat);
cv::Mat cMat = cv::Mat(dMat.nr(), dMat.nc(), CV_8UC3, ptrMat);

// unsigned char
matrix<unsigned char> dMat;
load_image(dMat, img_path);
uchar *ptrMat = (uchar *)image_data(dMat);
// cv::Mat cMat = cv::Mat(dMat.nr(), dMat.nc(), CV_8UC1, ptrMat);
// 或者:
cv::Mat cMat = cv::Mat(dMat.nr(), dMat.nc(), CV_8U, ptrMat);

//rgb_alpha_pixel

可是要注意有一種狀況,rgb_alpha_pixel四通道矩陣,這一種沒有提供bgr_alpha_pixel,因此直接轉爲CV_8UC4的時候紅藍通道是錯誤的,這個時候可能就要取捨,去掉alpha通道,改成bgr_pixel後轉爲CV_8UC3;也能夠轉爲CV_8UC4後對紅藍通道作調整便可。code

二、cv::Mat轉matrix或array2d

cv::Mat轉爲dlib::matrix和dlib::array2d的時候要先轉爲cv_image,而後再經過assign_image轉爲matrix或array2d,dlib提供了幾種OpenCV支持的數據格式,其接口以下:接口

cv_image (const cv::Mat img)
cv_image (const IplImage img)
cv_image (const IplImage* img)

因此在轉以前,要先把cv::Mat轉爲cv_image。it

代碼以下:圖像處理

//CV_8U/CV_8UC1 ==>> unsigned char
array2d<unsigned char> dMat_;
assign_image(dMat_, cv_image<unsigned char>(cMat));

//CV_8UC3 ==>> bgr_pixel
array2d<bgr_pixel> dMat_;
assign_image(dMat_, cv_image<bgr_pixel>(cMat));

一樣,若是8UC4要轉爲rgb_alpha_pixel的時候,仍是要先對紅藍通道調整,再轉爲rgb_alpha_pixel,或者就轉爲bgr_pixel後再轉rgb_alpha_pixel。ast

天之蒼蒼,其正色邪?class

其遠而無所至極邪?變量

相關文章
相關標籤/搜索