1. 程式人生 > >Dlib與Opencv的影象轉換

Dlib與Opencv的影象轉換

dlib的影象格式是array2d,opencv的影象格式是mat。在dlib程式碼中使用opencv的影象格式的話,我目前想到兩種方法。假設D盤下面有一張影象lenna.bmp。array2d的讀存圖,可用下面兩行程式碼:
load_image(arr2d的影象, 儲存在電腦中的影象全路徑);
//儲存影象有幾種格式
save_bmp(array2d影象, 儲存到電腦的全路徑)
save_png(array2d影象, 儲存到電腦的全路徑)
save_jpeg(array2d影象, 儲存到電腦的全路徑);
經試驗,影象的字尾名並不強制要求與前面的save_*相同。dlib預設不支援jpg和png格式的影象,如果要新增支援的話,需要在屬性–巨集中新增定義:DLIB_PNG_SUPPORT,DLIB_JPEG_SUPPORT,如果這樣還不行的話,最好重新cmake,檢視DLIB_LINK_WITH_LIBJPEG和DLIB_LINK_WITH_LIBPNG是否選中。
1:標頭檔案中增加引用#include < dlib/opencv.h>

void main()
{

cv::Mat matTmp = cv::imread(“D:/lenna.bmp”);
cv_image cvimg = matTmp; (1)
//cv_image cvimg02(matTmp); (2)
//通過式1和式2,都可以對cv_image進行賦值,
//而且這個cv_image在dlib的程式中已經可以代替array2d影象運行了。
//如果仍要對array2d的影象進行賦值的話,可以按如下操作
array2d< bgr_pixel> arrimg;
assign(arrimg, cvimg);

}

目前暫不清楚對cv_image影象的畫素訪問和儲存影象。方法二通過迴圈賦值的方式對array2d影象進行賦值

void main()
{

cv::Mat matTmp = cv::imread(“D:/lenna.bmp”);
array2d< bgr_pixel> arrimg(matTmp.rows, matTmp.cols);
for(int i=0; i < matTmp.rows; i++)
{

for(int j=0; j < matTmp.cols; j++)
{

arrimg[i][j].blue = matTmpp.at< cv::Vec3b>(i,j)[0];
arrimg[i][j].green=matTmpp.at< cv::Vec3b>(i,j)[1];
arrimg[i][j].red = matTmpp.at< cv::Vec3b>(i,j)[2];

}

}

}

注意定義影象的時候指定影象的寬高。通過迴圈賦值之後,array2d格式的影象,已經可以正常操作了,訪問畫素點的值,儲存影象等,如果是灰度圖的話,可以定義為array2d< uchar> arrimg,操作與上面的操作基本相同,上面操作的影象是三通道彩色影象。