使用OpenCV计算黑色像素数量

8

我正在使用opencv 2.4.0C++进行工作。

我正在尝试完成一个练习,要求我加载一张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;
}

目前这段代码非常基础,但它现在能够完成预期的功能。稍后会进行一些调整来使其更加简洁 :)


你需要提供你收到的错误是什么。它是编译错误吗?运行时错误吗?等等? - UpAndAdam
你是用C还是C++写的? cvCountNonZeroC函数。C++中为countNonZero... http://docs.opencv.org/modules/core/doc/operations_on_arrays.html - UpAndAdam
1个回答

20
你可以使用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;

只是好奇,问题主要是他的TotalNumberOfPixels错误了,还是他混合使用了C和C++接口? - UpAndAdam
我认为问题在于您混合使用了C和C++。您正在使用C++接口,并将Mat用作图像的数据类型。Mat没有widthheight成员,而是有rowscols。此外,您可能正在使用C API函数cvCountNonZeroMat参数一起使用,该函数用于C++ API。 - Ove
当我输入那段代码时,它会给我一个未处理的异常:内存位置0x0033F890处的异常。它还向控制台/窗口写入了一些内容: OpenCV错误:在未知函数、文件c:\slave\builds\WinInstallerMegaPack\src\opencv\modules\core\src\stat.cpp的第496行中,断言失败<src.channels<> == 1 & func !=0>。我尝试在一个新项目中使用您提供的代码,只加载图像并应用您的代码。同样的错误。 - Jakob
也许我的安装有问题?我正在使用Visual Studio,如果这与此有关的话。是的,我混淆了一些C和C++的东西。嘿嘿。 - Jakob
2
为什么不使用 countNonZero(bwImage==0) 来计算零像素? - zhangxaochen
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接