簡體   English   中英

C ++,使用OpenCV的像素的負RGB值

[英]C++, Negative RGB values of pixels using OpenCV

我正在使用OpenCV迭代圖像並找到每個像素的顏色,這里是我正在使用的一些代碼:

IplImage* img = cvLoadImage("c:\\test.png");

int pixels = img->height * img->width;
int channels = img->nChannels;

for (int i = 0; i < pixels*channels; i+= channels)
{

    unsigned char red = img->imageData[i + 2];
    unsigned char green = img->imageData[i + 1];
    unsigned char blue = img->imageData[i];

    outputRGBValues(red, green, blue);
    if (red == REDCOLOUR && green == GREENCOLOUR && blue == BLUECOLOUR)
    {
        count++;
    }
}
cvReleaseImage(&img);

當我運行它時,outputRGBValues輸出負值。 最常見的是R,G,B = -1,但偶爾還有其他負數和少數正數。 我聽說過未初始化的內存內容,以及沒有正確分配給內存的像素。 但我真的不明白它,絕對不知道如何解決它。 我做錯了什么,我該如何解決?

UPDATE

在使用fschmitt的更改修復代碼(如上所述)后,我更接近了。 是我正在使用的圖像,如果有任何幫助的話。 很難看,但它只是一個5 * 3'V'的黑色像素,底部有一個綠色像素。

運行代碼,我得到這個輸出:

0 0 0
255 255 255
255 255 255
255 255 255
0 0 0
255 255 186
0 0 255
255 255 0
And it continues

前5行很好,正是它們應該是什么。 這是圖像的第一行。 下一行,第6行以后是錯誤的。 它應該是:

255 255 255
255 255 255
0 0 0

我不確定是什么原因引起的。 它如何適用於頂線而不是第二線? 是否存在某種不匹配的問題,並且它的價值在左邊的位置有一點?

嘗試這個:

IplImage* img = cvLoadImage("c:\\test.png");

for (int i = 0; i < img->height; i++)
{
    for (int j = 0; j < img->width; j += img->nChannels)
    {
        unsigned char red = img->imageData[i * img->widthStep + j + 2];
        unsigned char green = img->imageData[i * img->widthStep + j + 1];
        unsigned char blue = img->imageData[i * img->widthStep + j];

        outputRGBValues(red, green, blue);
        if (red == REDCOLOUR && green == GREENCOLOUR && blue == BLUECOLOUR)
        {
            count++;
        }
    }
}
cvReleaseImage(&img);

雖然您已經知道圖像尺寸(通過使用IplImage::heightIplImage::width證明)並且opencv確實提供了訪問像素值的功能,但我不明白為什么你盲目地訪問像素數據(通過1D索引) cvGet*D )。

您在直接指針訪問中得到奇數值,因為您沒有考慮OpenCV執行的字節填充 出於這個原因,您可能會在8位圖像中找到(width * nChannels <= widthStep)。

快速修訂的代碼如下:

IplImage* img = cvLoadImage("c:\\test.png");
for(int iRow=0; iRow<img->height; ++iRow)
{
    for(int iCol=0; iCol<img->width; ++iCol)
    {
        CvScalar pixelVal = cvGet2D( img, iRow, iCol);
        unsigned char red = pixelVal.val[2];
        unsigned char green = pixelVal.val[1];
        unsigned char blue = pixelVal.val[0];

        outputRGBValues(red, green, blue);
        if (red == REDCOLOUR && green == GREENCOLOUR && blue == BLUECOLOUR)
        {
            count++;
        }
    }
}
cvReleaseImage(&img);

另外,請注意,OpenCV通常以BGR格式排列數據,可以在IplImage::channelSeq驗證。 不要混淆IplImage::colorModel ,它告訴顏色模型。

我將與Paul R建議您在嘗試使用它們之前找到參考並理解庫。

我從來沒有使用過OpenCV,但我認為cvCreateImage不會初始化圖像的內容,當然也不會有任何意義。

這里有一些問題:

  • 您需要使用有意義的數據填充圖像
  • 根據圖像的構造方式,您可能已經交換了紅色和藍色
  • 你應該使用unsigned char red
  • 您為每個像素聲明一個向量,不要使用它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM