Как я могу оценить окружность по зашумленному изображению в OpenCV

#python #opencv

#python #opencv

Вопрос:

Я использую OpenCV для обработки изображений из видеопотока с камеры. Камера наблюдает за электродом после того, как к нему была приварена проволока, и моя цель — оценить местоположение центра сварного шва. Я могу получить четкую цель, преобразовав изображение в HSV и установив пороговые значения оттенков от 6 до 20, однако результирующий порог очень зашумленный. Вы можете четко видеть круговые объекты на изображении порога, однако компоненты не подключены, поэтому у меня возникли проблемы с получением хорошего приближения с использованием HoughCircles. Я также пробовал использовать minEnclosingCircle для контуров после сортировки их по площади, но это не более согласованно и намного медленнее. Прошу прощения за низкое качество, я новичок в программировании, и python — единственный язык, с которым мне удобно. Я использую Python 3.0 и OpenCV 4.3.0

Изображение того, что видит камера…
Изображение после установления порога Другие изображения

     frame_raw = cam.get_array()
    #frame_raw = np.load('frame_raw5.npy')#loads array directly instead of image
    frame_color = cv2.cvtColor(frame_raw,cv2.COLOR_BayerRG2RGB)#convert to color
    frame_down = cv2.pyrDown(frame_color)#scale down to speed up processing
    frame_blur = cv2.medianBlur(frame_down, int(2*values["-BLUR SLIDER-"] 1))
    frame_gray = cv2.cvtColor(frame_down,cv2.COLOR_BGR2GRAY)
    frame_HSV = cv2.cvtColor(frame_down, cv2.COLOR_BGR2HSV)
   
    frame_threshold = cv2.inRange(frame_HSV, (values["-LOW H-"], values["-LOW S-"], values["-LOW V-"]), (values["-HIGH H-"], values["-HIGH S-"], values["-HIGH V-"]))
    edges = cv2.Canny(frame_blur, values["-CANNY SLIDER A-"], values["-CANNY SLIDER B-"])
    #Try to find circles approximating weld----------------------------------------------------------------------------------------------------------------------
    try:
        #[ry1:ry2,rx1:rx2] is bounding box around the weld selected by cv2.ROI
        circles = cv2.HoughCircles(frame_threshold[ry1:ry2,rx1:rx2],cv2.HOUGH_GRADIENT,1,1,param1=1,param2=20,minRadius=100,maxRadius=200)
    except:
        None
    try:
        if circles is not None:            
            weld = np.around(np.average(circles, axis=1)).flatten().astype(int)#average all circles into one
            if len(weld_list) > 15: weld_list.pop()#add average to list, past averages from 15 frames
            weld_list.insert(0,weld)
            if weld_list:
                weld_centroid = np.average(weld_list,axis=0).astype(int)
        if values["-CIRCLES-"]:
            cv2.circle(frame_down[ry1:ry2,rx1:rx2,:],(weld_centroid[0],weld_centroid[1]),weld_centroid[2],(100,255,100),2)
            cv2.circle(frame_down[ry1:ry2,rx1:rx2,:],(weld_centroid[0],weld_centroid[1]),5,(100,255,100),-1)
    except:
        None
  

Комментарии:

1. Пожалуйста, добавьте изображение с комментариями, чтобы показать, где находится этот круг.