代码解释false的意思:Vector<Mat> blockMat = ImageUtil.screenBlock(src, contours, false, debug, tempPath);
时间: 2024-02-01 20:12:07 浏览: 119
在这个代码中,false作为第三个参数传递给了screenBlock函数。根据函数的定义,该参数控制是否对每个检测到的轮廓进行筛选。当该参数设置为false时,表示不进行筛选,保留所有检测到的轮廓;当该参数设置为true时,表示对每个轮廓进行筛选,只保留符合条件的轮廓。因此,false的意思是不进行轮廓筛选。
相关问题
代码解释:public static Vector<Mat> findPlateByContours(Mat src, Mat inMat, Vector<Mat> dst, Boolean debug, String tempPath) { // 灰度图 Mat gray = new Mat(); ImageUtil.gray(inMat, gray, debug, tempPath); Imgcodecs.imwrite(tempPath + Constant.TEMP_GRAY, gray); // 高斯模糊 Mat gsMat = new Mat(); ImageUtil.gaussianBlur(gray, gsMat, debug, tempPath); Imgcodecs.imwrite(tempPath + Constant.TEMP_GAUSSIAN, gsMat); // Sobel 运算,得到图像的一阶水平方向导数 Mat sobel = new Mat(); ImageUtil.sobel(gsMat, sobel, debug, tempPath); Imgcodecs.imwrite(tempPath + Constant.TEMP_SOBEL, sobel); // 图像进行二值化 Mat threshold = new Mat(); ImageUtil.threshold(sobel, threshold, debug, tempPath); Imgcodecs.imwrite(tempPath + Constant.TEMP_THRESHOLD, threshold); // 使用闭操作 同时处理一些干扰元素 Mat morphology = threshold.clone(); ImageUtil.morphologyClose(threshold, morphology, debug, tempPath); // 闭操作 Imgcodecs.imwrite(tempPath + Constant.TEMP_CLOSE, morphology); // 边缘腐蚀,边缘膨胀,可以多执行两次 morphology = ImageUtil.erode(morphology, debug, tempPath, 4, 4); Imgcodecs.imwrite(tempPath + Constant.TEMP_ERODE, morphology); morphology = ImageUtil.dilate(morphology, debug, tempPath, 4, 4, true); Imgcodecs.imwrite(tempPath + Constant.TEMP_DILATE, morphology); // 保存结果到目标文件 // 将二值图像,resize到原图的尺寸; 如果使用缩小后的图片提取图块,可能会出现变形,影响后续识别结果 ImageUtil.enlarge(morphology, morphology, src.size(), debug, tempPath); Imgcodecs.imwrite(tempPath + Constant.TEMP_RESIZE, morphology); // 获取图中所有的轮廓 List<MatOfPoint> contours = ImageUtil.contours(src, morphology, debug, tempPath); Imgcodecs.imwrite(tempPath + Constant.TEMP_CONTOUR, morphology); // 根据轮廓, 筛选出可能是车牌的图块 Vector<Mat> blockMat = ImageUtil.screenBlock(src, contours, false, debug, tempPath); // 找出可能是车牌的图块,存到dst中, 返回结果 hasPlate(blockMat, dst, debug, tempPath + "contour/"); return dst; }
这段代码实现了一个车牌识别的功能,具体步骤如下:
1. 将输入图像转换为灰度图,并进行高斯模糊,以减少噪声的影响。
2. 对图像进行 Sobel 运算,得到图像的一阶水平方向导数,以便后续进行边缘检测。
3. 对图像进行二值化处理,将图像转为黑白二值图像。
4. 使用闭操作处理图像,以去除一些干扰元素。
5. 对图像进行边缘腐蚀和膨胀操作,以进一步消除干扰元素。
6. 将处理后的图像放大至原图的尺寸,避免后续识别过程中出现变形。
7. 获取图中所有的轮廓,以便后续筛选可能是车牌的图块。
8. 根据轮廓信息,筛选出可能是车牌的图块,并将其存储到目标文件中。
9. 对筛选出的图块进行车牌识别,最终返回识别结果。
该代码段中调用了一些封装好的图像处理函数,包括灰度化、高斯模糊、Sobel 运算、二值化、闭操作、边缘腐蚀和膨胀、轮廓提取等。其中还有一些中间结果写入到文件中,以便调试和观察。最终将识别结果存储在目标文件中,并返回给调用者。
代码解释public static void hasPlate(Vector<Mat> inMat, Vector<Mat> dst, Boolean debug, String tempPath) { int i = 0; for (Mat src : inMat) { if (src.rows() == Constant.DEFAULT_HEIGHT && src.cols() == Constant.DEFAULT_WIDTH) { // 尺寸限制; 已经结果resize了,此处判断一下 Mat samples = SVMTrain.getFeature(src); float flag = svm.predict(samples); if (flag == 0) { // 目标符合 dst.add(src); ImageUtil.debugImg(true, tempPath, "platePredict", src); Imgcodecs.imwrite(tempPath + i++ + "_" + Constant.TEMP_PREDICATE, src); } } } }
这段代码是一个车牌识别的功能实现。它的输入是一组图像(inMat),输出是一组识别出来的车牌图像(dst)。具体的实现过程如下:
1. 首先对每张图像进行尺寸限制判断,判断其是否符合默认的车牌尺寸(即Constant.DEFAULT_HEIGHT和Constant.DEFAULT_WIDTH)。
2. 如果符合尺寸要求,则调用SVMTrain.getFeature()方法获取该图像的特征向量。
3. 通过调用svm.predict()方法,对该特征向量进行预测,并得到一个标志值flag。
4. 如果flag等于0,表示该图像识别为车牌,则将其添加到输出列表dst中,并将其保存到本地磁盘中。
5. 最后,如果debug参数为true,则调用ImageUtil.debugImg()方法显示该图像。
需要注意的是,该代码依赖于SVMTrain类和ImageUtil类。其中,SVMTrain类用于训练和加载SVM分类器模型,ImageUtil类用于图像的读取、保存和显示。
阅读全文