【问题标题】:OpenCV counting number of pixels in a horizontal lineOpenCV计算水平线上的像素数
【发布时间】:2014-10-25 10:58:11
【问题描述】:

我希望在二进制图像的每一行中找到白色像素的数量。如果该计数大于 90,我希望通过将该行中的每个像素值更改为 0 来删除整行。我编写的代码不起作用。显然,我在输出时得到了相同的二进制图像。 请帮我解决问题。顺便说一句,我正在使用 openCV 2.0。

using namespace std;

double a = 15;

double b = 255;

Mat I1;

int main(int argv, char **argc)

{

    cv: Mat I = imread("abc.bmp");

    if (I.empty())

    {

        std::cout << "!!! Failed imread(): image not found" << std::endl;

    }

    threshold(I, I1, a, b, THRESH_BINARY);


    int r = I.rows;

    int c = I.cols;

    for (int j = 0; j < r; j++)

    {

        int count = 0;

        for (int i = 0; i < c; i++)

        {

            if (I1.at<uchar>(j, i) == 255)

                count = count + 1;

        }

        if (count > 90)

        {

            for (int i = 0; i < c; i++)

                I1.at<uchar>(j, i) = 0;

        }

    }
    namedWindow("Display window", 0);// Create a window for display.

    imshow("Display window", I1);


    waitKey(0);

    return 0;
}

【问题讨论】:

  • 阈值化后检查图像。难道计数永远不会>90?
  • 当前使用的图像尺寸为 4096*3072。我已经在 matlab 中开发了类似的代码,并希望在 openCV 中实现它
  • 代码看起来没有问题。如果可能,请发布输入图像、二值图像和输出图像。
  • 请发布输入/阈值/输出。如果您没有足够的声誉在 SO 上上传图片,请使用图片托管平台
  • 请注意,jet47 的回答是正确的,cv::threshold 需要灰度图像作为输入才能实现预期的行为!!

标签: c++ opencv image-processing


【解决方案1】:

默认imread 返回 3 通道 BGR 图像。如果要加载灰度/二值图像,请使用cv::IMREAD_GRAYSCALE 参数:

cv::Mat I = cv::imread("abc.bmp", cv::IMREAD_GRAYSCALE);

【讨论】:

  • cv::Mat I = imread("abc.bmp",0);帮助..非常感谢你:-)
猜你喜欢
  • 2014-05-22
  • 1970-01-01
  • 2012-04-27
  • 2015-12-08
  • 2018-02-26
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多