2013-10-03 44 views
4

我在opencv 2.4.0工作和C++使用OpenCV的

我嘗試這樣做,說我應該加載一個RGB圖像的運動計數的黑色像素,將其轉換爲灰度並保存新的圖像。下一步是將灰度圖像製作成二進制圖像並存儲該圖像。我有很多工作。

我的問題是計算二值圖像中黑色像素的數量。

到目前爲止,我已經在網上搜索並查看了這本書。我發現的方法似乎是最有用的方法。

int TotalNumberOfPixels = width * height; 
int ZeroPixels = TotalNumberOfPixels - cvCountNonZero(cv_image); 

但我不知道如何存儲這些值並在cvCountNonZero()中使用它們。當我傳遞我想從這個函數計算的圖像時,我得到一個錯誤。

int main() 
{ 
    Mat rgbImage, grayImage, resizedImage, bwImage, result; 

    rgbImage = imread("C:/MeBGR.jpg"); 
    cvtColor(rgbImage, grayImage, CV_RGB2GRAY); 

    resize(grayImage, resizedImage, Size(grayImage.cols/3,grayImage.rows/4), 
      0, 0, INTER_LINEAR); 

    imwrite("C:/Jakob/Gray_Image.jpg", resizedImage); 
    bwImage = imread("C:/Jakob/Gray_Image.jpg"); 
    threshold(bwImage, bwImage, 120, 255, CV_THRESH_BINARY); 
    imwrite("C:/Jakob/Binary_Image.jpg", bwImage); 
    imshow("Original", rgbImage); 
    imshow("Resized", resizedImage); 
    imshow("Resized Binary", bwImage); 

    waitKey(0); 
    return 0; 
} 

到目前爲止,這段代碼是非常基本的,但是它現在做它應該做的。一些調整將在稍後進行清理:)

+0

您需要提供你收到的錯誤。這是一個編譯錯誤?運行時錯誤?等等? – UpAndAdam

+0

你是用'C'還是'C++'做這個:'cvCountNonZero'是'C'函數。 'C++'是'countNonZero' ... http://docs.opencv.org/modules/core/doc/operations_on_arrays.html – UpAndAdam

回答

14

您可以使用countNonZero來計算圖像中不是黑色(> 0)的像素數。如果要計算黑色(== 0)像素的數量,則需要從圖像中的像素數(圖像寬度*高度)中減去非黑色的像素數。

此代碼應工作:

int TotalNumberOfPixels = bwImage.rows * bwImage.cols; 
int ZeroPixels = TotalNumberOfPixels - countNonZero(bwImage); 
cout<<"The number of pixels that are zero is "<<ZeroPixels<<endl; 
+0

只是好奇,問題主要是他的TotalNumberOfPixels錯了,或者他混合C與C++ api在一起? – UpAndAdam

+0

我認爲問題在於你在混合使用C和C++。您正在使用C++接口,並將Mat用作圖像的數據類型。 Mat沒有'width'和'height'成員,它有'rows'和'cols'。另外,您可能使用C API函數'cvCountNonZero'和'Mat'參數,該參數在C++ API中使用。 – Ove

+0

當我輸入該代碼時,它給了我一個未處理的異常:內存位置0x0033F890處的異常。它在控制檯/窗口中寫了一些東西: OpenCV錯誤:在未知函數中文件c:\ slave \ builds \ WinInstallerMegaPack \ src \ opencv中聲明爲 == 1&func!= 0> \ modules \ core \ src \ stat.cpp,line496 我試圖使用您在新項目中提供的代碼,我只是加載圖像並應用您的代碼。同樣的錯誤。 – Jakob