在以下程序中,它捕获并处理图像运行时。但是我在代码中面临很多问题。第一个问题是,当第一次初始化相机并且如果它无法在捕获的帧中检测到红色时,则会出现以下错误。
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
是否有任何有效的方法来实现上述代码,例如使用视频处理?
答案 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循环之外。