python - 如何修复使用cv2.absdiff时该操作也不是 'array op array'

标签 python python-3.x opencv opencv-contour

我试图通过定义2帧来找出从同一视频中检索到的差异。我是python和opencv的新手。我一直在从https://www.youtube.com/watch?v=MkcUgPhOlP8&list=WL&index=9&t=136s跟随教程。

这是弹出的错误。

OpenCV(4.1.1) C:\projects\opencv-python\opencv\modules\core\src\arithm.cpp:663: error: (-209:Sizes of input arguments do not match) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function 'cv::arithm_op'



我在StackOverflow中发现了类似的问题,但该问题是指图像。我不确定如何在我的代码中实现它。
这是我找到的链接OpenCV - Sizes of input arguments do not match - addWeighted

...
import cv2
import numpy as np

cap = cv2.VideoCapture('C:\\Users\\User\\Downloads\\768x576.avi')
frame_width = int( cap.get(cv2.CAP_PROP_FRAME_WIDTH))

frame_height =int( cap.get( cv2.CAP_PROP_FRAME_HEIGHT))

fourcc = cv2.VideoWriter_fourcc('X','V','I','D')

out = cv2.VideoWriter("output.avi", fourcc, 5.0, (768,576))


ret, frame1 = cap.read()
ret, frame2 = cap.read()
print(frame1.shape)
print(frame2.shape)
while cap.isOpened():
    diff = cv2.absdiff(frame1, frame2)
    gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
    blur = cv2.GaussianBlur(gray, (5,5), 0)
    _, thresh = cv2.threshold(blur, 20, 255, cv2.THRESH_BINARY)
    dilated = cv2.dilate(thresh, None, iterations=3)
    contours, _ = cv2.findContours(dilated, cv2.RETR_TREE, 
    cv2.CHAIN_APPROX_SIMPLE)

    for contour in contours:
        (x, y, w, h) = cv2.boundingRect(contour)

        if cv2.contourArea(contour) < 800:
            continue
        cv2.rectangle(frame1, (x, y), (x+w, y+h), (0, 255, 0), 2)
    image = cv2.resize(frame1, (768,576))
    out.write(image)
    cv2.imshow("feed", frame1)
    frame1 = frame2
    ret, frame2 = cap.read()

    if cv2.waitKey(40) == 27:
        break

cv2.destroyAllWindows()
cap.release()
out.release()

...

自从我按照视频中的所有内容进行操作后,我预计不会出现任何错误。

最佳答案

如果仍然有人在寻找答案,这就是您的解决方法。

ret, frame1 = cap.read()
print(ret)
ret, frame2 = cap.read()
print(ret)

while cap.isOpened():
    if ret==False:
        print(ret)
        break

正如@zeFrenchy和@Mauro Dorni指出的那样,发生错误的原因是由于视频上限已结束,而cv2甚至在结束后仍试图捕获它。

关于python - 如何修复使用cv2.absdiff时该操作也不是 'array op array',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57866589/

相关文章:

python - 如何通过用户的命令行参数选择导入的python文件

python - 在 Windows 10 中安装适用于 Python 3.7.1 的 Mayavi

c++ - 参数传递

python - 如何动态更改 __slots__ 属性?

image-processing - 线扫描openCV

c++ - CMakeLists.txt 不会创建可用的 makefile(Ubuntu 和 C++)

python - StatsModels公式多项式回归与numpy polyfit系数不匹配

python - 如何根据在条件下重置的累积总和进行分组

python - 当与 uwsgi 一起使用时,redis 附加值而不是设置它

python-3.x - 错误 : Python3. 4 -> java.lang.RuntimeException : PipeMapRed. waitOutputThreads():子进程失败,代码为 1