c++ - Opencv C++ 阈值在 absdiff、条码检测后不起作用

标签 c++ opencv image-processing barcode-scanner threshold

我正在尝试使用 OpenCv 从图像中检测条形码, 我正在使用渐变法:http://www.pyimagesearch.com/2014/11/24/detecting-barcodes-images-python-opencv/ 在以下问题的帮助下:How to find the location of red region in an image using MATLAB?

代码:

Mat imgco,img,imgx,imgy,thresh;
imgco = imread("/Users/a/Desktop/barcode_01.jpg");

//### Convert image to grayscale ###
cvtColor(imgco,img,CV_BGR2GRAY);
imshow("img", img);
waitKey(0);

//### Finding horizontal and vertical gradient ###

Sobel(img,imgx,CV_16S,1,0,-1,50,0,BORDER_DEFAULT);
imgx = abs(imgx);
imshow("img", imgx);
waitKey(0);

Sobel(img,imgy,CV_16S,0,1,-1,50,0,BORDER_DEFAULT);
imgy = abs(imgy);
imshow("img", imgy);
waitKey(0);

absdiff(imgx, imgy, img);
imshow("img", img);
waitKey(0);

//### Low pass filtering ###
GaussianBlur(img, img, Size(9,9), 0);
imshow("img", img);
waitKey(0);

//### Applying Threshold ###
threshold(img,thresh,225,255,CV_THRESH_BINARY);
imshow("img", thresh);
waitKey(0);

现在程序可以正确处理高斯模糊,尝试以某种方式对图像进行阈值处理会得到空白输出。谁能建议可能是什么问题?

Gaussian Output: Threshold Output:

谢谢。

更新:在 AbsDiff 之前应用阈值操作,导致阈值正确。因此,有一些与使用 AbsDiff 相关的东西,那就是搞乱了阈值。有帮助吗?

更新 2:将我的输出与以下内容进行比较:http://www.pyimagesearch.com/wp-content/uploads/2014/11/barcode_gradient_and_detection.jpg 我意识到我得到的是灰色图像,而作者得到的是清晰的黑色免费背景?即使我们正在执行相同的操作。谢谢。

最佳答案

好的解决方案:

1) 不需要在梯度操作中使用缩放。

2) 需要使用convertScaleAbs方法将图像转换为8bit。

img.convertTo(img, CV_8U, 0.00390625);

不起作用。解决问题! :) pyimage作者的帮助!

关于c++ - Opencv C++ 阈值在 absdiff、条码检测后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27587931/

相关文章:

c++ - 如何清除包含 C 函数声明的字符串中的注释和中间空格?

c++ - C/C++ ncurses 卡住

c++ - 在 C++ 中将图像从 Pylon 转换为 Opencv

opencv - Tesseract (Tess4j) 提高准确性

image-processing - 如何在 3D 中进行高斯滤波

c++ - 按值传递类时,调用者或被调用者是否调用析构函数?

c++ - 保证用于序列化目的的 reinterpret_cast 输出

c++ - 无法从源代码安装opencv

image - 是否有一种算法可以确定图像是否是分形?

MATLAB psf2otf 函数的 Python 等效项