我有一個視頻,我試圖使用cv2.polyfill和bitwise操作來顯示一個特定區域。當我在圖片上這樣做時,效果很好,但當我在視頻上這樣做時,卻出現了以下錯誤。我之前在另一張圖片/視頻上這樣做沒有問題。要顯示的區域確實顯示為一個凍結的圖片,但也使內核崩潰。代碼是:
import cv2
import numpy as np
cap = cv2.VideoCapture("heartvideo.wmv"/span>,0)
def roi(frame)。
mask = np.zeros_like (frame)
陣列 = np.zeros_like (frame) array([[148,550], [300, 650],[400,680],[800, 680], [880,560]。 [555,70], [492,50]])
輪廓 = np. array([[50,50], [50,150] 。[150,150], [150,50] ] ]
cv2.fillPoly(mask, pts = [array], color =(255))
masked = cv2.bitwise_and(mask,frame)
return mask
while(cap.isOpened()): # while video is initialised.
ret, frame = cap.read() #逐位讀取視頻。
adj = roi(frame)
if ret:
cv2.imshow("Image"/span>, adj)
else:
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
if cv2.waitKey(15) & 0xFF == ord('q')。
break。
cap.release()
cv2.destroyAllWindows()
錯誤。OpenCV(4.5.3) :-1: 錯誤。(-5:Bad argument) in function 'fillPoly'
過載決議失敗:
- img資料型別=17不被支持
。- 預期Ptr<cv::UMat>為引數'img'
。
uj5u.com熱心網友回復:
問題在于你使用的是一個3通道的BGR掩碼(資料型別17是一個3通道的影像)。你使用了np.zero_like(frame)來設定你的掩碼,這意味著它的尺寸與你傳入的影像完全相同。如果你想讓它成為一個單通道的影像,你應該設定尺寸。
我不確定你使用的是哪個版本的OpenCV,我無法在OpenCV 4.4中復制這個錯誤。在這個版本中,即使你在fillPoly引數中指定了一個單通道的顏色,它也允許一個3通道的影像,盡管它是通過假設你的顏色是(255,0,0)來實作的。這可能是因為在不同版本的OpenCV上,顏色的尺寸必須與影像的尺寸相匹配,所以它在抱怨。
試試這個修訂版的代碼,看看它是否有效。
import cv2
import numpy as np
def roi(frame)。
# 在面具上畫一個多邊形。
height,width = frame.shape[:2] 。
mask = np.zeros((height, width), np.uint8);
array = np.zeros((height, width, np.uint8)); array = np.zeros((height, width) array([[148,550], [300, 650],[400,680],[800, 680], [880,560]。 [555,70], [492,50]])
輪廓 = np. array([[50,50], [50,150] 。[150,150], [150,50] ] ]
cv2.fillPoly(mask, pts = [array], color =(255))
# mask東西在框架上。
# masked = cv2.bitwise_and(mask,frame)
copy = np.zeros_like(frame);
copy[mask == 255] = frame[mask == 255] 。
return copy;
# open video
cap = cv2.VideoCapture("heartvideo.wmv", 0) 。
while(cap.isOpened())。# while video is initialised.
ret, frame = cap.read() #逐位讀取視頻。
if ret:
adj = roi(frame)
cv2.imshow("Image"/span>, adj)
else:
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
if cv2.waitKey(15) == ord('q'/span>) 。
break。
cap.release()
cv2.destroyAllWindows()
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/328637.html
標籤:
