2017-04-01 82 views
0

我目前正在做Raspberry Pi 3模型B的橙色球的实时对象检测。下面的代码应该是一个帧,然后用cv2.inRange()功能,使用RGB(BGR)滤除图像。然后我应用dialation和侵蚀去除噪音。然后我找到轮廓并绘制它们。此代码一直工作到现在。然而,当我今天跑了它在不改变它,我得到了如下因素的错误:Python OpenCV:inRange()停止工作,没有变化

Traceback (most recent call last): 
File "/home/pi/Desktop/maincode.py", line 12, in <module> 
    mask = cv2.inRange(frame, lower, upper) 
error: /build/opencv-ISmtkH/opencv-2.4.9.1+dfsg/modules/core/src/arithm.cpp:2701: error: (-209) The lower bounary is neither an array of the same size and same type as src, nor a scalar in function inRange 

任何帮助将是真正真棒,因为我是新来的OpenCV,花了很多时间proggraming这一点,我有一个方案竞赛机器人在5天内。

预先感谢您

  import cv2 
      import cv2.cv as cv 
      import numpy as np 


      capture = cv2.VideoCapture(0) 
      while capture.isOpened: 
        ret, frame = capture.read() 
        im = frame 
        lower = np.array([0, 100 ,150], dtype = 'uint8') 
        upper = np.array([10,180,255], dtype = 'uint8') 
        mask = cv2.inRange(frame, lower, upper) 
        eroded = cv2.erode(mask, np.ones((7, 7))) 
        dilated = cv2.dilate(eroded, np.ones((7, 7))) 
        contours, hierarchy = cv2.findContours(dilated,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 

        cv2.drawContours(im,contours,-1,(0,255,0),3) 
        cv2.imshow('colors',im) 
        cv2.waitKey(1) 
+0

您确定您在'mask = cv2.inRange(frame,lower,upper)'中输入的帧不是空的吗?在这个语句之前尝试打印'frame.shape'。 – ZdaR

回答

0

您收到几乎可以肯定是错误意味着你有一个空的图像(或你混淆了你的输入图像的大小)。

OpenCV中的网络摄像头捕捉通常从一个或几个黑色/静态图像(糟糕的驱动程序)开始。由于速度太快,这就是为什么你没有注意到这一点。但是,如果要处理图像,这将对您的应用程序产生影响。因此,我建议您在继续进行计算之前检查图像。只要你capture.read()行后补充一点:

if ret == True: 

注:确保(在控制台或打印的东西),当你开始拍摄这只是发生。如果这种情况经常发生(网络摄像头的空帧),可能还有其他问题(或者可能与您的网络摄像头有关)。另外在另一台计算机上检查它。

+0

谢谢! Coluld缺电是一个问题? –

+0

我希望这能解决你的问题!如果问题仅出现在第一帧上,请不要担心。我也有多个网络摄像头。如果它晚些时候还会发生,那可能确实是硬件相关的问题。确保Pi获得足够的电力。另外尝试使用另一台网络摄像头或另一台计算机上的原始网络摄像头进行测试。看看问题是否仍然存在。祝你好运!另外,如果这个答案解决了你的问题,不要忘记接受它作为答案! – Jurjen