有没有办法使用 JavaCV 将我的车牌号涂成黑色?
Posted
技术标签:
【中文标题】有没有办法使用 JavaCV 将我的车牌号涂成黑色?【英文标题】:Is there any way to paint my plate numbers to black using JavaCV? 【发布时间】:2017-08-15 20:09:39 【问题描述】:您好,我两天前开始使用 JavaCV,
我正在尝试在 Java SE 和 Maven 下的 git 存储库中创建一个 ANPR Open Source System。
我已检测到我的矩形板,现在我正尝试为 OCR 读取准备好图像。
原图:
现在我得到了这张图片:
,
有什么方法可以使用 JavaCv 将我的车牌号变黑?我一点也不知道如何使用 javacv 函数。
这里我给你产生这个结果的方法:
首先我在模糊之后调用它
public void toB_A_W(JLabel jLabel)
Mat rgbImage = Imgcodecs.imread(original);
Mat destination = new Mat(rgbImage.rows(), rgbImage.cols(), rgbImage.type());
// l objectif et de corriger les erreur de la transformation en noire et blan
int dilation_size = 2;
// la matrice de la dilatation on cherche a dilater en forme de rectange ( Imgproc.MORPH_RECT )
Mat element1 = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(dilation_size + 1, dilation_size + 1));
// on dilate l image
Imgproc.dilate(rgbImage, destination, element1);
Mat labImage = new Mat();
cvtColor(destination, labImage, Imgproc.COLOR_BGR2GRAY);
Imgcodecs.imwrite(ocrReadFrom, labImage);
jLabel.setIcon(new ImageIcon(ocrReadFrom));
JOptionPane.showConfirmDialog(null, "");
然后我称之为:
public void toB_W(JLabel jLabelBlackAndWhiteImage)
// cella est l image de l ocr
smouthedImage = opencv_imgcodecs.cvLoadImage(ocrReadFrom);
blackAndWhiteImageOCR = opencv_core.IplImage.create(smouthedImage.width(),
smouthedImage.height(), IPL_DEPTH_8U, 1);
// la fonction qui va executé la transformation en noire et blan
System.out.println("0");
//cvAdaptiveThreshold(smouthedImage, smouthedImage, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, opencv_imgproc.CV_THRESH_MASK, 15, -2);
opencv_imgproc.cvSmooth(smouthedImage, smouthedImage);
System.out.println("1");
cvCvtColor(smouthedImage, blackAndWhiteImageOCR, CV_BGR2GRAY);
System.out.println("2");
cvAdaptiveThreshold(blackAndWhiteImageOCR, blackAndWhiteImageOCR, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY_INV, 17, -4);
System.out.println("3");
opencv_imgproc.cvSmooth(blackAndWhiteImageOCR, blackAndWhiteImageOCR);
// fin de la transformation
cvSaveImage(ocrReadFrom, blackAndWhiteImageOCR);
...
谢谢
【问题讨论】:
你能附上原始图像吗,从哪里生成这个图像? 反转图像:每个像素集pixel = 255 - pixel
=> 数字将是黑色的,周围是白色的。但可能不完全是你想要的 ;)
@ZdaR 这里是原始图像,感谢您检查我的存储库中的项目以进一步理解我使用 Segmentation.toB_A_W() 然后调用 Logique.toB_W()
@MohammedHousseynTaleb 您可以考虑采用阈值并将其作为 OCR 的输入
@JeruLuke 我的 OCR 在读取数字(1 和 7)(6 和 5)时遇到了很大的麻烦。我正在使用 javaOCR 我仍在尝试解决此问题,但欢迎提供任何帮助(我需要所有想法和知识,因为我没有导师)。
【参考方案1】:
您想填写数字,可以考虑执行二进制阈值而不是自适应阈值。
我选择了 40 的阈值水平来区分数字。
【讨论】:
这适用于这个答案的范围......但是根据(固定)阈值分割车牌字符是......嗯...... 非常乐观 @Miki,您的评论可能适用于很多图像检测问题及其解决方案! @JeruLuke 是的,我看到了......但是关于 ALPR,你不会在阈值方面走得太远(自动/动态/自适应/其他)......我在这方面有很多经验问题;) 嗯,它很广泛......基本上首先以某种方式检测板(困难的部分)。一旦你有一个好的作物(例如只包含黄色板),提取单个字符会简单得多(阈值也可能起作用;))...如果你知道国籍,你还有一些模式可以检查以了解是否您获得的字符是否构成有效车牌...然后您将收到限速罚款;) @Miki 非常感谢!!以上是关于有没有办法使用 JavaCV 将我的车牌号涂成黑色?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法用 PHP 和 Imagick 找到被黑色边框包围的特定像素区域?
javacpp-opencv图像处理系列:国内车辆牌照检测识别系统(万份测试车牌识别准确率99.7%以上,单次平均耗时39ms)