由于常常习惯的用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
其远而无所至极邪?变量