用于车牌的 Opencv 图像分割
Opencv Image segmentation for licence plate
我正在做一个读取车牌的项目,我的计划是
- 将图像转换为灰度以获得更好的性能
- 使用直方图均衡器带出车牌字符
- 模糊图像以去除一些噪点
- 使用自适应阈值对图像进行二值化
- 使用开闭形态
- 检测车牌的矩形边界框
嗯,问题是:我的代码不太好,结果很糟糕我无法检测到矩形,下面是我的代码:
Imgproc.cvtColor(image, image, Imgproc.COLOR_BGR2GRAY, 0);
Imgproc.blur(image, image, new Size(3, 3));
Imgproc.equalizeHist(image, image);
Mat openElem = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(1, 1));
Mat closeElem = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(1, 1));
Imgproc.adaptiveThreshold(image, image, 225, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY_INV, 11, 2);
输入图像:
输出图像:
如果有经验的人能帮忙,我将不胜感激
首先检测图片中的车牌位置比较好,按照以下步骤即可:
转换为灰色
cvCvtColor(图像,灰度,CV_BGR2GRAY);
做索贝尔
Mat sobel = new Mat(grayScale.size(), CvType.CV_16S);
cvSobel(grayScale, sobel, 2, 0, 7);
Mat temp = new Mat(sobel.size(), CvType.CV_8UC1);
convertScaleAbs(sobel, temp, 0.00390625, 0);
做阈值
cvThreshold(sobel, threshold, 0, 255, CV_THRESH_BINARY| CV_THRESH_OTSU);
做形态学
Mat kernal = cvCreateStructuringElementEx(3,1, 1, 0, CV_SHAPE_RECT);
cvDilate(threshold, erode_dilate, kernal, 2);//X
vErode(erode_dilate, erode_dilate, kernal, 4);//X
cvDilate(erode_dilate, erode_dilate, kernal, 2);//X
kernal = cvCreateStructuringElementEx(1, 3, 0, 1, CV_SHAPE_RECT);
cvErode(erode_dilate, erode_dilate, kernal, 1);// 是
cvDilate(erode_dilate, erode_dilate, 内核, 2);
- 现在您可以检测图像中的矩形了:
- 然后就可以对印版进行OCR处理了
希望对你有帮助!
好的,这就是我想出的
Imgproc.cvtColor(image, image, Imgproc.COLOR_BGR2GRAY, 0);
originalFrameGrayScale = image.clone();
Mat morph = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(9, 3));
Imgproc.morphologyEx(image, image, Imgproc.MORPH_TOPHAT, morph);
Imgproc.Sobel(image, image, -1, 2, 0);
Imgproc.GaussianBlur(image, image, new Size(5,5), 3,3);
Imgproc.morphologyEx(image, image, Imgproc.MORPH_CLOSE, morph);
Imgproc.threshold(image, image, 200, 255, Imgproc.THRESH_OTSU);
Vector<Rect> rectangles = detectionContour(image);
并找到高度、宽度和面积符合特定值的最大轮廓
enter image description here
我正在做一个读取车牌的项目,我的计划是
- 将图像转换为灰度以获得更好的性能
- 使用直方图均衡器带出车牌字符
- 模糊图像以去除一些噪点
- 使用自适应阈值对图像进行二值化
- 使用开闭形态
- 检测车牌的矩形边界框
嗯,问题是:我的代码不太好,结果很糟糕我无法检测到矩形,下面是我的代码:
Imgproc.cvtColor(image, image, Imgproc.COLOR_BGR2GRAY, 0);
Imgproc.blur(image, image, new Size(3, 3));
Imgproc.equalizeHist(image, image);
Mat openElem = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(1, 1));
Mat closeElem = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(1, 1));
Imgproc.adaptiveThreshold(image, image, 225, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY_INV, 11, 2);
输入图像:
输出图像:
如果有经验的人能帮忙,我将不胜感激
首先检测图片中的车牌位置比较好,按照以下步骤即可:
转换为灰色
cvCvtColor(图像,灰度,CV_BGR2GRAY);
做索贝尔
Mat sobel = new Mat(grayScale.size(), CvType.CV_16S); cvSobel(grayScale, sobel, 2, 0, 7); Mat temp = new Mat(sobel.size(), CvType.CV_8UC1); convertScaleAbs(sobel, temp, 0.00390625, 0);
做阈值
cvThreshold(sobel, threshold, 0, 255, CV_THRESH_BINARY| CV_THRESH_OTSU);
做形态学
Mat kernal = cvCreateStructuringElementEx(3,1, 1, 0, CV_SHAPE_RECT); cvDilate(threshold, erode_dilate, kernal, 2);//X vErode(erode_dilate, erode_dilate, kernal, 4);//X cvDilate(erode_dilate, erode_dilate, kernal, 2);//X
kernal = cvCreateStructuringElementEx(1, 3, 0, 1, CV_SHAPE_RECT); cvErode(erode_dilate, erode_dilate, kernal, 1);// 是 cvDilate(erode_dilate, erode_dilate, 内核, 2);
- 现在您可以检测图像中的矩形了:
- 然后就可以对印版进行OCR处理了
希望对你有帮助!
好的,这就是我想出的
Imgproc.cvtColor(image, image, Imgproc.COLOR_BGR2GRAY, 0);
originalFrameGrayScale = image.clone();
Mat morph = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(9, 3));
Imgproc.morphologyEx(image, image, Imgproc.MORPH_TOPHAT, morph);
Imgproc.Sobel(image, image, -1, 2, 0);
Imgproc.GaussianBlur(image, image, new Size(5,5), 3,3);
Imgproc.morphologyEx(image, image, Imgproc.MORPH_CLOSE, morph);
Imgproc.threshold(image, image, 200, 255, Imgproc.THRESH_OTSU);
Vector<Rect> rectangles = detectionContour(image);
并找到高度、宽度和面积符合特定值的最大轮廓 enter image description here