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