首先說一下我發現這個神奇的問題的過程:我是在做產品的有效區域查詢時發現,好好的演算法有時候可以準確的提取產品有效區域,有時候會出問題,後來就將二值化影象畫素值列印出來,最後發現有時候其中會出現乙個、兩個或者三個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...