2013-03-18 62 views
0

我試圖到圖像數據從字符轉換成C++翻一番,例如OpenCV的圖像數據類型的轉換

Mat img = imread(image_file); 
Mat img_double; 
img.convertTo(img_double, CV64FC3); 

然後我認爲img_double應存儲在DOUBLE的圖像數據,我試圖img_double .depth()它顯示爲6,這是正確的。但是,如何訪問該DOUBLE數據? img_double.data仍然在uchar *類型中。有誰能夠幫助我?謝謝!

+1

我覺得這前一個線程的回答將幫助http://stackoverflow.com/a/1735135 – 2013-03-18 03:31:03

回答

0

您可以通過以下方式訪問img_double的數據。

img_double.at<Vec3d>(i, j)[0] -> B 
img_double.at<Vec3d>(i, j)[1] -> G 
img_double.at<Vec3d>(i, j)[2] -> R 

這麼的imgdouble_img存取像素值,你可以做這樣的事情

printf("%d %d %d\n", img.at<Vec3b>(0, 0)[0], img.at<Vec3b>(0, 0)[1], img.at<Vec3b>(0, 0)[2]); 
printf("%f %f %f\n", double_img.at<Vec3d>(0, 0)[0], double_img.at<Vec3d>(0, 0)[1], double_img.at<Vec3d>(0, 0)[2]); 

This可能會更有幫助。

+0

這工作,謝謝! – Austin 2013-03-18 19:42:26

0

img_data始終是uchar(它是字節 - 這就是所有的內存),圖像類型只是跟蹤你想要的類型和範圍。

Opencv CV是/心臟的C庫,因此無法將數據自動轉換爲其他類型,但您始終可以將其轉換爲其他類型。

1

C/C++使用unsigned char作爲一組字節的通用數據類型。 因此,在cv::Mat中使用uchar數據指針可以避免爲每種圖像類型更改指針的聲明,從而避免子類化cv::Mat並允許通過memcpy或指針作用法進行直接數據傳輸。

然後使用Casting來返回庫的用戶所需的數據類型。

請注意,OpenCV 2.x爲您提供了預期的功能cv::Mat::ptr<type>(ìnt rowIndex)以獲取指定給定行的指針。 例如,指針雙數據類型的灰度圖像的6行的開頭是做:

double *rowPtr = my_mat.ptr<double>(6) 
+0

後續問題,它如何存儲其他數據類型如「double」,而所有數據由uchar表示?它「祕密」分配更多的字節數據,但保持數據類型爲uchar? – Austin 2013-03-18 19:39:07

+0

沒關係,它在Shafik Yaghmour提到的帖子stackoverflow.com/a/1735135中有解釋 – Austin 2013-03-19 01:45:03