在给定的图片中寻找平板矩形。

8
这是我的原始图片,我想找到这个矩形中的车牌号码,而不是在整张图片中搜索。
原始图像 test_1.jpg:

enter image description here
使用以下代码在 javacv 中:
IplImage originalImage = cvLoadImage("test_1.jpg");
IplImage resultImage = IplImage.create(originalImage.width(),
                originalImage.height(), IPL_DEPTH_8U, 1);
cvCvtColor(originalImage, resultImage, CV_BGR2GRAY);
cvAdaptiveThreshold(resultImage, resultImage, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY_INV, 7, 7);
cvSaveImage("test_2.jpg", resultImage);

生成的图片test_2.jpg如下所示:

enter image description here

然后将以下代码添加到给thresholdImg赋值resultImg的位置:

static void findLines(IplImage thresholdImg)
{
    IplImage dst;
    IplImage colorDst;
    dst = cvCreateImage(cvGetSize(thresholdImg), thresholdImg.depth(), 1);
    colorDst = cvCreateImage(cvGetSize(thresholdImg), thresholdImg.depth(), 3);    
    cvCanny(thresholdImg, dst, 100, 200, 3);
    CvSeq lines = new CvSeq();
    CvMemStorage storage = cvCreateMemStorage(100000); 
    cvSaveImage("test_3.jpg", dst);
}

生成的结果图片为test_3.jpg:

enter image description here

是否有任何一张图片可以用来继续我的代码,以便在图像中找到包含车牌的矩形

2个回答

4

你走在正确的方向上。

  1. 在对图像进行二值化之前,您需要执行某种平滑/模糊处理,以消除不必要的噪点。

  2. 像现在一样对图像应用阈值。

  3. 使用OpenCV库的膨胀函数轻微地膨胀检测到的边缘。这很有用,因为一旦车牌字符被膨胀,它们就会填充所包含的矩形。

  4. OpenCV 有一个名为cvRectangle的函数,可以搜索图像中的矩形形状。有很多在线文档可帮助您使用它。

  5. 最后,根据长宽比和面积过滤找到的车牌候选矩形形状。例如,在我的测试图像中,葡萄牙的车牌长宽比在2到3.5之间,面积约为5000-7000像素。显然,这取决于车牌的形状、图片大小等因素。

我向您保证,这种方法是有效的。我自己使用过它,并且它可以在99.5%的车辆照片中检测出车牌区域。

你可能想做的一件事是在阈值之前使用Sobel滤波器(也可在OpenCV库中找到),如果您的图片过亮。那只需要在步骤2中进行更改,其他步骤保持不变。

希望我对您有所帮助 :)


cvRectangle方法不是用于搜索矩形而是用于绘制它们。我有什么遗漏吗? - David Novák
OpenCV确实可以基于一些数学公式找到几何形状和模式,就像上面用简单的矩形面积计算描述的那样。 - Rafael Matos
1
在OpenCV中是否有任何函数可以找到矩形内的矩形形状?您提到了cvRectangle,但该函数是用于绘制矩形而不是查找它们的。来源:doc) - David Novák
我已经有将近两年没有做这个了,但是从我记得的来看,你是正确的:cvRectangle可以画矩形,然后你可以通过应用所需算法(面积比率等)来筛选它们。最终,你应该只剩下符合要求的矩形。 - Rafael Matos

2

1
我读了这本书,也看了这段代码,但是我在将C++代码转换为JavaCV时遇到了问题。在JavaCV中找不到一些C++函数,或者这些函数的替代方法与C++中不同,有些参数被添加或者参数类型发生了变化,这让我感到困惑。因此,我正在寻找一个简明的解决方案。 - HADEV

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