From 62a010a25d40b6f3d81960eed0f4279f33bc1827 Mon Sep 17 00:00:00 2001 From: UncleLLD Date: Fri, 10 Dec 2021 03:11:05 +0800 Subject: [PATCH] Merge pull request #21224 from UncleLLD:fix-cvtColor-error fix cvtColor-error * fix gray image channel error * fix gray image channel error * fix cvtColor error after the video end * fix cvtColor error after the video end and change next variable * fix cvtColor error after the video end * reset next variable * fix cvtColor error after the video end * fix cvtColor error after the video end --- .../video/optical_flow/optical_flow.py | 28 +++++++++++-------- .../video/optical_flow/optical_flow_dense.py | 28 +++++++++++-------- 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/samples/python/tutorial_code/video/optical_flow/optical_flow.py b/samples/python/tutorial_code/video/optical_flow/optical_flow.py index 93bb2c421e..0e298e773a 100644 --- a/samples/python/tutorial_code/video/optical_flow/optical_flow.py +++ b/samples/python/tutorial_code/video/optical_flow/optical_flow.py @@ -17,12 +17,12 @@ feature_params = dict( maxCorners = 100, blockSize = 7 ) # Parameters for lucas kanade optical flow -lk_params = dict( winSize = (15,15), +lk_params = dict( winSize = (15, 15), maxLevel = 2, criteria = (cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 0.03)) # Create some random colors -color = np.random.randint(0,255,(100,3)) +color = np.random.randint(0, 255, (100, 3)) # Take first frame and find corners in it ret, old_frame = cap.read() @@ -33,7 +33,11 @@ p0 = cv.goodFeaturesToTrack(old_gray, mask = None, **feature_params) mask = np.zeros_like(old_frame) while(1): - ret,frame = cap.read() + ret, frame = cap.read() + if not ret: + print('No frames grabbed!') + break + frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # calculate optical flow @@ -45,18 +49,20 @@ while(1): good_old = p0[st==1] # draw the tracks - for i,(new,old) in enumerate(zip(good_new, good_old)): - a,b = new.ravel() - c,d = old.ravel() - mask = cv.line(mask, (int(a),int(b)),(int(c),int(d)), color[i].tolist(), 2) - frame = cv.circle(frame,(int(a),int(b)),5,color[i].tolist(),-1) - img = cv.add(frame,mask) + for i, (new, old) in enumerate(zip(good_new, good_old)): + a, b = new.ravel() + c, d = old.ravel() + mask = cv.line(mask, (int(a), int(b)), (int(c), int(d)), color[i].tolist(), 2) + frame = cv.circle(frame, (int(a), int(b)), 5, color[i].tolist(), -1) + img = cv.add(frame, mask) - cv.imshow('frame',img) + cv.imshow('frame', img) k = cv.waitKey(30) & 0xff if k == 27: break # Now update the previous frame and previous points old_gray = frame_gray.copy() - p0 = good_new.reshape(-1,1,2) + p0 = good_new.reshape(-1, 1, 2) + +cv.destroyAllWindows() diff --git a/samples/python/tutorial_code/video/optical_flow/optical_flow_dense.py b/samples/python/tutorial_code/video/optical_flow/optical_flow_dense.py index b937b24ea7..8980c151c5 100644 --- a/samples/python/tutorial_code/video/optical_flow/optical_flow_dense.py +++ b/samples/python/tutorial_code/video/optical_flow/optical_flow_dense.py @@ -2,22 +2,28 @@ import numpy as np import cv2 as cv cap = cv.VideoCapture(cv.samples.findFile("vtest.avi")) ret, frame1 = cap.read() -prvs = cv.cvtColor(frame1,cv.COLOR_BGR2GRAY) +prvs = cv.cvtColor(frame1, cv.COLOR_BGR2GRAY) hsv = np.zeros_like(frame1) -hsv[...,1] = 255 +hsv[..., 1] = 255 while(1): ret, frame2 = cap.read() - next = cv.cvtColor(frame2,cv.COLOR_BGR2GRAY) - flow = cv.calcOpticalFlowFarneback(prvs,next, None, 0.5, 3, 15, 3, 5, 1.2, 0) - mag, ang = cv.cartToPolar(flow[...,0], flow[...,1]) - hsv[...,0] = ang*180/np.pi/2 - hsv[...,2] = cv.normalize(mag,None,0,255,cv.NORM_MINMAX) - bgr = cv.cvtColor(hsv,cv.COLOR_HSV2BGR) - cv.imshow('frame2',bgr) + if not ret: + print('No frames grabbed!') + break + + next = cv.cvtColor(frame2, cv.COLOR_BGR2GRAY) + flow = cv.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0) + mag, ang = cv.cartToPolar(flow[..., 0], flow[..., 1]) + hsv[..., 0] = ang*180/np.pi/2 + hsv[..., 2] = cv.normalize(mag, None, 0, 255, cv.NORM_MINMAX) + bgr = cv.cvtColor(hsv, cv.COLOR_HSV2BGR) + cv.imshow('frame2', bgr) k = cv.waitKey(30) & 0xff if k == 27: break elif k == ord('s'): - cv.imwrite('opticalfb.png',frame2) - cv.imwrite('opticalhsv.png',bgr) + cv.imwrite('opticalfb.png', frame2) + cv.imwrite('opticalhsv.png', bgr) prvs = next + +cv.destroyAllWindows()