首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >'cv::tracking::impl::TrackerKCFImpl::getSubWindow‘函数中的OpenCV(4.5.5)错误:(-215:断言失败) img.channels() == 3

'cv::tracking::impl::TrackerKCFImpl::getSubWindow‘函数中的OpenCV(4.5.5)错误:(-215:断言失败) img.channels() == 3
EN

Stack Overflow用户
提问于 2022-06-07 07:06:14
回答 1查看 376关注 0票数 1

当我运行下面的程序代码时,我会得到以下错误:

代码语言:javascript
运行
复制
  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()。有人知道吗?请注意,我已经缩短了我的原始代码很多。但本质上,这个块读取一个视频剪辑并分析指定的视频帧范围,一帧一帧。

代码语言:javascript
运行
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-07 09:51:49

我做了更多的研究,看起来(-215:断言失败) img.channels() == 3意味着最近使用tracker.update的tracker.update函数需要图像有3个通道(即。在颜色上)。因为我不得不把我的图像转换成灰度,这使得我的roi图像变成了1通道。

为了解决这一问题,我只需要在tracker.update之前添加以下行,以便在完成灰比例尺所需操作之后,将灰度图像重新转换回彩色图像:

代码语言:javascript
运行
复制
roi = cv2.cvtColor(roi, cv2.COLOR_GRAY2BGR)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72527161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档