java - OpenCV检测钻孔
问题描述
我正在做一个项目,我必须检测表面上的钻孔。(顶部两个孔仅用于定位目的)
检测到孔后,图案将判断孔的位置并给出结果。我创建了一个覆盖网格布局并将其放置在 camera2api 预览上,以便用户可以对齐孔并扫描(真正的测试不会是来自 LCD 的图片,如屏幕截图所示)
目前,我正在根据网格裁剪图像并将其调整为 1920x2560 以获得一致的模式判断框架,这使得单个网格大约为 300 像素。我无法检测到斑点,有人能建议我应该为这项工作选择哪种过滤方式吗最终结果(x 和 y 轴)
这是我的代码:
Mat srcMat = resizeAndCropMatToGrid(mats[0]);
if (srcMat == null) {
exception = new Exception("Cropping Failed");
errorMessage = "Unable to crop image based on grid";
return null;
}
matProgressTask = srcMat;
Mat processedMat = new Mat();
Imgproc.cvtColor(srcMat, processedMat, Imgproc.COLOR_BGR2GRAY);
Imgproc.GaussianBlur(processedMat, processedMat, new org.opencv.core.Size(5, 5), 5);
Imgproc.threshold(processedMat, processedMat, 115, 255, Imgproc.THRESH_BINARY);
matProgressTask = processedMat;
FeatureDetector featureDetector = FeatureDetector.create(FeatureDetector.SIMPLEBLOB);
featureDetector.read(Environment.getExternalStorageDirectory() + "/Android/blob.xml");
MatOfKeyPoint matOfKeyPoint = new MatOfKeyPoint();
featureDetector.detect(processedMat, matOfKeyPoint);
KeyPoint[] keyPointsArray = matOfKeyPoint.toArray();
Log.e("keypoints", "" + Arrays.toString(keyPointsArray));
if (keyPointsArray.length < 1) {
exception = new Exception("Blobs Missing");
errorMessage = "Error: Unable to filter blobs";
} else {
try {
MatOfKeyPoint matOfKeyPointFilteredBlobs = new MatOfKeyPoint(keyPointsArray);
Features2d.drawKeypoints(srcMat, matOfKeyPointFilteredBlobs, srcMat, new Scalar(255, 0, 0), Features2d.DRAW_OVER_OUTIMG);
} catch (Exception e) {
e.printStackTrace();
exception = e;
errorMessage = "Error: Unable to draw Blobs";
return null;
}
matProgressTask = srcMat;
onProgressUpdate();
patterData = pinpointBlobsToGetData(keyPointsArray);
if (patterData == null) {
exception = new Exception("Unable to establish pattern");
errorMessage = "Error: Key points array is null";
}
}
这是我正在使用的 blobby 文件配置:
<?xml version="1.0"?>
<opencv_storage>
<format>3</format>
<thresholdStep>10.</thresholdStep>
<minThreshold>50.</minThreshold>
<maxThreshold>120.</maxThreshold>
<minRepeatability>2</minRepeatability>
<minDistBetweenBlobs>20.</minDistBetweenBlobs>
<filterByColor>1</filterByColor>
<blobColor>0</blobColor>
<filterByArea>1</filterByArea>
<minArea>2300.</minArea>
<maxArea>4500.</maxArea>
<filterByCircularity>1</filterByCircularity>
<minCircularity>0.2</minCircularity>
<maxCircularity>1.0</maxCircularity>
<filterByInertia>1</filterByInertia>
<minInertiaRatio>0.2</minInertiaRatio>
<maxInertiaRatio>1.0</maxInertiaRatio>
<filterByConvexity>1</filterByConvexity>
<minConvexity>0.2</minConvexity>
<maxConvexity>1.0</maxConvexity>
</opencv_storage>
解决方案
我正在使用 Python。
对于您提供的第二张图片,我成功检测到了这些孔......
...使用此代码...
import cv2
import numpy as np
img = cv2.imread("C:\\Users\\Link\\Desktop\\2.jpg")
# cv2.imshow("original", img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cv2.imshow("gray", gray)
blur = cv2.medianBlur(gray, 31)
# cv2.imshow("blur", blur)
ret, thresh = cv2.threshold(blur, 127, 255, cv2.THRESH_OTSU)
# cv2.imshow("thresh", thresh)
canny = cv2.Canny(thresh, 75, 200)
# cv2.imshow('canny', canny)
im2, contours, hierarchy = cv2.findContours(canny, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
contour_list = []
for contour in contours:
approx = cv2.approxPolyDP(contour, 0.01 * cv2.arcLength(contour, True), True)
area = cv2.contourArea(contour)
if 5000 < area < 15000:
contour_list.append(contour)
msg = "Total holes: {}".format(len(approx)//2)
cv2.putText(img, msg, (20, 40), cv2.FONT_HERSHEY_PLAIN, 2, (0, 0, 255), 2, cv2.LINE_AA)
cv2.drawContours(img, contour_list, -1, (0, 255, 0), 2)
cv2.imshow('Objects Detected', img)
cv2.imwrite("detected_holes.png", img)
cv2.waitKey(0)
现在,第一个有点不同。相同的代码无法检测正确数量的孔。该程序还不断检测显然不是洞(左下角的裂缝......)缺少一些主洞。
这是我正在谈论的一个例子:
在这种情况下,不仅计数器错误,而且主要问题是无法检测到右下方的孔。
推荐阅读
- mime-types - 媒体类型规范中的“模板”是什么意思?
- database-design - 谷歌日历提醒的提醒数据模型
- javascript - 使用 redux-saga-test-plan,我有一个将函数作为参数的调度操作。这使得测试总是失败
- java - Webview 自定义后退按钮
- python - 发送相同请求时接收来自 tensorflow 服务模型的不同响应
- excel-formula - 如何重新排序 excel 中的数据列/为什么 Xlookup 公式不适用于全套数据?
- acumatica - 使用 Fluent BQL 创建处理视图
- css - 在 github markdown table 中定位图片
- c# - 在 ..Net5.0 中找不到 System.Windows.GridLength
- c++ - developertudio12.6 CC on Solaris intel i386,编译器不显示错误或警告但失败