2017-04-01 84 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