簡體   English   中英

OpenCV檢測鑽孔

[英]OpenCV detecting drilled holes

我正在一個項目中,我必須檢測表面上的鑽孔。 (頂部兩個孔,僅用於定向目的)

圖像:表面掃描樣品1 圖像:掃描樣品2的表面

在檢測到孔之后,圖案將判斷孔的位置並給出結果。 我已經創建了一個覆蓋網格布局,並將其放置在camera2api預覽上,以便用戶可以對齊孔並進行掃描(真正的測試不會是LCD屏幕上的圖片,如屏幕截圖所示)

在此處輸入圖片說明

目前,我正在基於網格裁剪圖像並將其大小調整為1920x2560,以具有用於模式判斷的一致幀,這使得單個網格大約為300px。 我無法檢測到斑點,是否有人可以建議我應該為這項工作選擇哪種過濾方式,以及是否有比使用網格布局更好的方法,而不是使用網格布局,因為孔相對於定向孔的位置很重要最終結果(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";
            }
        }

這是我正在使用的大型文件配置:

 <?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。

對於您提供的第二張圖片,我成功檢測到了孔...

RES1

...使用此代碼...

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)

現在,第一個有點不同。 相同的代碼將無法檢測正確數量的孔。 該程序還將繼續檢測明顯缺少孔(缺少一些主要孔的孔)。

這是我正在談論的示例:

RES2

不僅計數器在這種情況下是錯誤的,而且主要的問題是無法檢測到右下角的孔。

因此,我已經設法通過將墊子直接傳遞給FeatureDetector類來解決它,而無需任何事先處理...

            Mat srcMat = mats[0];
        if (srcMat == null) {
            exception = new Exception("Cropping Failed");
            errorMessage = "Unable to crop image based on grid";
            return null;
        }
        matProgressTask = srcMat;

        FeatureDetector featureDetector = FeatureDetector.create(FeatureDetector.SIMPLEBLOB);
        featureDetector.read(Environment.getExternalStorageDirectory() + "/Android/blob.xml");
        Log.e("LoadingBlob", "wqfqfwq");
        MatOfKeyPoint matOfKeyPoint = new MatOfKeyPoint();
        featureDetector.detect(srcMat, 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(0, 255, 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";
            }
        }

我的特征檢測器參數文件是:

 <?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>0</filterByColor> <blobColor>0</blobColor> <filterByArea>1</filterByArea> <minArea>3000.</minArea> <maxArea>10000.</maxArea> <filterByCircularity>1</filterByCircularity> <minCircularity>0.3</minCircularity> <maxCircularity>1.0</maxCircularity> <filterByInertia>1</filterByInertia> <minInertiaRatio>0.3</minInertiaRatio> <maxInertiaRatio>1.0</maxInertiaRatio> <filterByConvexity>1</filterByConvexity> <minConvexity>0.3</minConvexity> <maxConvexity>1.0</maxConvexity> </opencv_storage> 

結果圖像: 結果圖1

結果圖2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM