#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. Пожалуйста, добавьте изображение с комментариями, чтобы показать, где находится этот круг.