我有一個3通道的矩陣,我有一個訪問和更改元素值的問題。我有這樣的代碼:opencv矩陣多通道訪問和填充
Mat m(4,4, CV_8UC3);
Vec3b a;
a[0] = 255;
a[1] = 0;
a[2] = 0;
m.at<Vec3b>(0,0) = a;
當我打印的矩陣m,我有這樣的:
[255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
這是很好的,但是當我矩陣存儲與imwrite
我得到的圖像是這個:
,我不明白爲什麼它是藍色的,爲什麼我有一個方形的2x2藍色的,我應該只有第一像素的紅色不是嗎?
我在某個地方犯過一個錯誤嗎?
這不是OpenCV怪癖,但Windows怪癖。如果按原樣(如bmp或ppm)將3通道圖像緩衝區寫入磁盤並在某個圖片瀏覽器中打開它,則會看到它被視爲BGR圖像而不是RGB圖像。OpenCV使用RGB格式的圖像意味着交換每個imread和imwrite的圖像像素。在很多情況下這只是浪費時間。 –
好的,所以這是一個BMP和PPM的怪癖,成爲Opencv怪癖:)你碰巧知道像素在保存/閱讀JPG或PNG時是否交換? –
BMP和PPM只是存儲圖像緩衝區的格式示例,沒有任何類型的壓縮。如果您爲映像分配了1 MB內存並將其存儲在硬盤上,則硬盤上將佔用1兆字節。 PNG或JPEG並非如此。這些圖像將更小,這意味着它們被壓縮(PNG無損壓縮和JPG有損壓縮)。因此,關於交換的問題是毫無意義的,因爲這些格式不是存儲像素值,而是可以從中恢復這些值的數據。 –