使用opencv(cv2)和python面对图像捕获和处理程序中的错误

时间:2014-03-14 06:39:27

标签: opencv python-2.7

在以下程序中,它捕获并处理图像运行时。但是我在代码中面临很多问题。第一个问题是,当第一次初始化相机并且如果它无法在捕获的帧中检测到红色时,则会出现以下错误。

Traceback (most recent call last):
  File "/home/mukund/Desktop/Checknewcod/attempone.py", line 23, in <module>
    M=cv2.moments(best_cnt)
NameError: name 'best_cnt' is not defined

有时会出现以下错误。

Traceback (most recent call last):
  File "/home/mukund/Desktop/New logic/GridTestcal1.py", line 287, in <module>
    fun2()
  File "/home/mukund/Desktop/New logic/GridTestcal1.py", line 230, in fun2
    M=cv2.moments(best_cnt)
UnboundLocalError: local variable 'best_cnt' referenced before assignment

代码如下。

import cv2
import numpy as np
capture = cv2.VideoCapture(1)
num = 0
while True:           
    flag, img2 = capture.read()
    flag=capture.set(3,640)
    flag=capture.set(4,480)
    cv2.imwrite('pic'+str(num)+'.jpg', img2)
    img1=cv2.imread('pic'+str(num)+'.jpg')
    img=cv2.blur(img1,(3,3))
    ORANGE_MIN=np.array([170,160,60],np.uint8)
    ORANGE_MAX=np.array([180,255,255],np.uint8)
    hsv_img=cv2.cvtColor(img1,cv2.COLOR_BGR2HSV)
    frame_thresh=cv2.inRange(hsv_img,ORANGE_MIN,ORANGE_MAX)
    contours,hierarchy=cv2.findContours(frame_thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
    x_area=0
    for cnt in contours:
        area=cv2.contourArea(cnt)
        if area>x_area:
        x_area=area
        best_cnt=cnt     
    M=cv2.moments(best_cnt)
    cx,cy=int(M['m10']/M['m00']),int(M['m01']/M['m00'])
    cv2.circle(frame_thresh,(cx,cy),5,255,-1)
    cv2.imwrite('pic1'+str(num)+'.jpg',frame_thresh)
    print cx,cy
    if num == 30:
        capture.release()
        break         
    num += 1

是否有任何有效的方法来实现上述代码,例如使用视频处理?

1 个答案:

答案 0 :(得分:0)

对于错误,您应该检查返回的轮廓数是否> 0。 在某些情况下,没有检测到coutours,因此没有设置best_cnt,因此错误告诉您在定义该变量之前引用它。

for cnt in contours:
    area=cv2.contourArea(cnt)
    if area>x_area:  # I believe your code is indented wrongly here
        x_area=area
        best_cnt=cnt

if len(cnt) > 0:  # In some cases no coutours are detected so best_cnt is not set.   
    M=cv2.moments(best_cnt)
    cx,cy=int(M['m10']/M['m00']),int(M['m01']/M['m00'])
    cv2.circle(frame_thresh,(cx,cy),5,255,-1)
    cv2.imwrite('pic1'+str(num)+'.jpg',frame_thresh)
    print cx,cy

if num == 30:
    capture.release()
    break         
num += 1

我认为,代码的大部分处理时间应该是读取和写入图像。如果您从摄像机获取帧,那么事情可能会略好一些,特别是如果它的帧速率很高。如果您可以选择每隔一个k图像来编写帧,那么它可能有助于避免丢帧。 此外,如果您可以缩小感兴趣区域(ROI)并仅在其上执行cvtColor,inRange和findContours等图像处理算法,这将有所帮助。

一些小的调整是将ORANGE_MIN/MAX的声明移到while循环之外。