Mat和IplImage的4位元組對齊問題

2021-07-03 20:09:16 字數 1792 閱讀 7158

首先說一下我發現這個神奇的問題的過程:我是在做產品的有效區域查詢時發現,好好的演算法有時候可以準確的提取產品有效區域,有時候會出問題,後來就將二值化影象畫素值列印出來,最後發現有時候其中會出現乙個、兩個或者三個205,開始一直以為是我在某個地方對影象資料進行了操作,後來將所有操作都給取消,還是經常(為什麼不說總是呢,因為確實有時候沒出現)會出現205後來我除錯的時候看到了這個:

我當時就驚訝了,這。。。這是為什麼,後來看了

之後我就豁然開朗,特別興奮,因為這問題折磨了我三天(可能是我水平太差)。

以下是我所看的文章

mat中的影象資料是不對齊的,而

iplimage

中的影象資料是

4位元組對齊的,

所以在訪問iplimage影象資料的時候,要特別注意widthstep這個屬性,每行的位元組數不是width*nchannels而是widthstep,因為每行可能會有位元組填充的

//測試,9*7單通道灰度圖

void testmat4aligned()//測試mat是否位元組對齊

printf("\n\n");

//列印出iplimage

uchar *imagedata_ipl=(uchar *)iplimage->imagedata;

printf("iplimage\n");

for (int i=0;i<=pixelcount-1;++i)

printf("\n\n");

iplimage轉為mat//

//將位元組對齊的iplimage轉化為mat,看看是否還是位元組對齊

mat ipl2mat_true(iplimage,true);//拷貝資料

int withstep3=ipl2mat_true.step[0];//9

uchar *imagedata2=ipl2mat_true.data;

printf("mat ipl2mat_true(iplimage,true)\n");

for (int i=0;i<=pixelcount-1;++i)

printf("\n\n");

//將位元組對齊的iplimage轉化為mat,看看是否還是位元組對齊

mat ipl2mat_false(iplimage,false);//修改為非拷貝資料

int withstep4=ipl2mat_false.step[0];//12

uchar *imagedata3=ipl2mat_false.data;

printf("mat ipl2mat_false(iplimage,false)\n");

for (int i=0;i<=pixelcount-1;++i)

}

結果:

其中iplimage中每行都會多出3個位元組,因為iplimage4位元組對齊,而mat就不會存在這個問題

當將iplimage轉為mat的時候

引數需要設定為ture,如果設定為false則每行還是4位元組對齊

iplimage  iplimage;

mat mat(iplimage,true);//拷貝資料,此時mat就是非4位元組對齊了

Mat和IplImage相互轉換

mat 是opencv 和c 的介面矩陣類,imlimage 是opencv和c 語言的介面的結構體,但是c 程式有時候時候還是要用到 imlimage,例如在mfc中的picture control顯示。下面總結了針對opencv3.0以上版本的mat和iplimage相互轉換方法 cpp vie...

2 10 IplImage結構和 Mat結構的轉換

你需要將123.png的放在c的更目錄下!cpp view plain copy opencv2 protest.cpp 定義控制台應用程式的入口點。opencv檔案讀取程式 類名 1.cpp 編譯環境 vs2012 功能 學習opencv顯示 include stdafx.h include op...

Mat與IplImage之間的轉化

1 plimage轉mat 使用mat的建構函式 mat mat const iplimage img,bool copydata false 預設情況下copydata為false 注意 以下三種效果一致,均為淺拷貝 mat m srcimg mat m srcimg,false mat m sr...