I'm newbie with OpenCV, but I'm tring to do a solution to identify flaws in a machining process in a specific Region of Interrest (ROI).
I wrote a code that can 'identify' this ROI and ignores the rest of the part, however I don't know how to create a filter in that region, because my Canny image is formed by a lot of small areas, and not by a single area.
What I want to do, is find a way to get ROI's bounding box (x,y,w,h) coordinates for after filter my input (webcam) image with this ROI and apply again the Canny method to identify this machining flaws
I put my code and a image from the metal part and the Canny image showing the ROI. I've never use computer vision so I'd be very grateful if someone helps me.
def getContours(img):
contours, Hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for i in contours:
area = cv2.contourArea(i)
# print(area)
if area>500:
cv2.drawContours(img, i, -1, (255, 0, 0), 3)
return img
def empty(a):
pass
def detect_cont(img, pos_min, pos_max):
imgGray = convert_gray(img)
imgBlur = cv2.GaussianBlur(imgGray,(7,7),1)
imgContours = img.copy()
imgCanny = cv2.Canny(imgBlur, pos_min, pos_max) # 200,0
imgContours = getContours(imgCanny)
return imgCanny, imgContours
#cv2.imshow("Image", imgBlur)
#cv2.imshow("ImageCanny", imgCanny)
#cv2.waitKey(0)
if __name__ == '__main__':
#use_webcam()
#img = reading_image("Bad1.jpg")
#reading_video("")
#detect_cont(img)
cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars", 640, 240)
cv2.createTrackbar("Min", "TrackBars", 50, 300, empty)
cv2.createTrackbar("Max", "TrackBars", 50, 300, empty)
cv2.namedWindow("preview")
vc = cv2.VideoCapture(cv2.CAP_DSHOW)
vc.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
vc.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
vc.set(cv2.CAP_PROP_FOURCC, 0x32595559)
vc.set(10, 150)
vc.set(cv2.CAP_PROP_FPS, 20)
if vc.isOpened(): # try to get the first frame
rval, frame = vc.read()
else:
rval = False
running, frame = vc.read()
good = 1
bad = 1
while rval:
cv2.imshow("preview", frame)
pos_min = cv2.getTrackbarPos("Min", "TrackBars")
pos_max = cv2.getTrackbarPos("Max", "TrackBars")
img_final, imgContours = detect_cont(frame, pos_min, pos_max)
#cv2.imshow("Tons de Cinza", img_final)
cv2.imshow("Densenhado", imgContours)
rval, frame = vc.read()
key = cv2.waitKey(20)
if key == 27: # exit on ESC
break
if key & 0xFF == ord("q"):
running = False
vc.release()
cv2.destroyWindow("preview")
source https://stackoverflow.com/questions/72353750/how-can-i-identify-a-roi-that-is-formed-by-many-contours-canny-image-opencv
Comments
Post a Comment