Opencv中IplImage的四字节对齐问题
一、結(jié)構(gòu)解釋
? ? ? ? IplImage數(shù)據(jù)結(jié)構(gòu)體中有兩個(gè)寬度:
? ? ? ?1 是width屬性,表示圖像的每行像素?cái)?shù);
? ? ? ?2 是widthStep屬性,表示存儲(chǔ)一行像素需要的字節(jié)數(shù)。
? ? 在OpenCV里邊,widthStep必須是4的倍數(shù),從而實(shí)現(xiàn)字節(jié)對(duì)齊,有利于提高運(yùn)算速度。所以widthStep不等于width*nChannels。
? ? ?三通道字節(jié)圖像中,imageData排列如下,其中BGR分別為每個(gè)像素的三個(gè)通道值。
? ?舉例:如果單通道圖像寬度為3,由于不是4的整數(shù)倍,所以加一個(gè)字節(jié)補(bǔ)齊,則widthStep是4。即這個(gè)圖像的一行需要4個(gè)字節(jié),只使用前3個(gè),最后一個(gè)空著。也就是一個(gè)寬3高3的圖像的imageData數(shù)據(jù)大小為4*3=12字節(jié)。
? ?注意,在不知道imageData是四字節(jié)對(duì)齊的情況下直接讀取,會(huì)造成錯(cuò)位。空著的那個(gè)像素并不是無(wú)效的,它仍然可以被操作。
二、去掉補(bǔ)齊位,正常讀取
unsigned char* colors1 = (unsigned char*)input->imageData;unsigned char* colors2 = (unsigned char*)test->imageData;//字節(jié)對(duì)齊int widths = input->width; //每行像素個(gè)數(shù)int heights = input->height; int widthSteps = input->widthStep; //存儲(chǔ)一行像素需要的字節(jié)數(shù)int cn = input->nChannels;unsigned char* color1 = (unsigned char*)malloc(3* widths * heights *sizeof(unsigned char));unsigned char* color2 = (unsigned char*)malloc(3* widths * heights *sizeof(unsigned char));for (int i = 0; i < heights; i++)for (int j = 0; j < widths; j++){for (int k = 0; k < cn; k++){color1[i*widths*cn + cn*j + k] = colors1[i*widthSteps + j*cn + k];color2[i*widths*cn + cn*j + k] = colors2[i*widthSteps + j*cn + k];}}? ? ?理解:
? ? ?i*widthSteps + j*cn + k中,i*widthSteps計(jì)算前幾行的字節(jié)數(shù),j*cn計(jì)算當(dāng)前行已經(jīng)占有的字節(jié)數(shù),再加上1 2 3.
? ? ?i*widths*cn + cn*j + k中,?i*widths*cn是計(jì)算前幾行占有的字節(jié)數(shù),j*cn計(jì)算當(dāng)前行已經(jīng)占有的字節(jié)數(shù),再加上1 2 3.
? ??
總結(jié)
以上是生活随笔為你收集整理的Opencv中IplImage的四字节对齐问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C及opencv指针释放问题
- 下一篇: opencv读取视频并保存为图片