当我运行下面的程序代码时,我会得到以下错误:
File "C:\Users\angjw\Dropbox\NUS\Blink detection\mov files\Leye blink info extractor_v2.py", line 368, in <module>
ret, bbox = tracker.update(roi)
error: OpenCV(4.5.5) D:\a\opencv-python\opencv-python\opencv_contrib\modules\tracking\src\trackerKCF.cpp:688: error: (-215:Assertion failed) img.channels() == 3 in function 'cv::tracking::impl::TrackerKCFImpl::getSubWindow'问题是,同样的代码块在cv2版本4.0中运行得非常好。我不太清楚是什么改变了,因为这导致cv2无法正确地读取img.channels()。有人知道吗?请注意,我已经缩短了我的原始代码很多。但本质上,这个块读取一个视频剪辑并分析指定的视频帧范围,一帧一帧。
tracker = cv2.TrackerKCF_create()
while True and frameCount <= COUNTlastframe:
# Read a new frame
ok, frame = video.read()
if not ok:
break
roi = frame[roiCoor1: roiCoor2, roiCoor3: roiCoor4]
## Do a drift correction every 600 frames (10s) (was 500; 8.33s)
if frameCount % 600 == 0 and blinkStarted == False or frameCount == COUNTfirstframe:
xylocalizer = [0,0,0,0]
roi = frame[roiCoor1: roiCoor2, roiCoor3: roiCoor4]
rows, cols, _ = roi.shape
roi = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
roi = cv2.GaussianBlur(roi, (7, 7), 0)
_, threshold = cv2.threshold(roi, binaryThreshold, 255, cv2.THRESH_BINARY_INV) #min and max colour values for pupil threshold
contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key=lambda x: cv2.contourArea(x), reverse=True)
for cnt in contours:
(x, y, w, h) = cv2.boundingRect(cnt)
#cv2.rectangle(roi, (x, y), (x + w, y + h), (255, 0, 0), 2)
#cv2.line(roi, (x + int(w/2), y), (x + int(w/2), y+h), (255, 0, 0), 2)
break
## Sum up the xy location of eye for the first xysample seconds.
## *1.25 arbitrary value to increase ROI box size for greater detection accuracy.
xylocalizer[0] = xylocalizer[0] + x #x (from left)
xylocalizer[1] = xylocalizer[1] + y #y (from top)
xylocalizer[2] = xylocalizer[2] + w*1.25 #box width
xylocalizer[3] = xylocalizer[3] + h*1.25 #box height
tracker = cv2.TrackerKCF_create()
ok = tracker.init(frame, (int(xylocalizer[0]),int(xylocalizer[1]),int(xylocalizer[2]),int(xylocalizer[3])))
ret, bbox = tracker.update(roi)发布于 2022-06-07 09:51:49
我做了更多的研究,看起来(-215:断言失败) img.channels() == 3意味着最近使用tracker.update的tracker.update函数需要图像有3个通道(即。在颜色上)。因为我不得不把我的图像转换成灰度,这使得我的roi图像变成了1通道。
为了解决这一问题,我只需要在tracker.update之前添加以下行,以便在完成灰比例尺所需操作之后,将灰度图像重新转换回彩色图像:
roi = cv2.cvtColor(roi, cv2.COLOR_GRAY2BGR)https://stackoverflow.com/questions/72527161
复制相似问题