我正在尝试在视频中找到垂直线。 Python 2.7和OpenCV 3。
我正在使用背景减法,然后应用Canny Edge Detection滤镜。
我已经能够将HoughLinesP方法应用于单个图像,但需要将其扩展到视频。
运行基本代码集时,我收到此错误(我认为这对应于下面的行(30-33):
Traceback (most recent call last):
File "test3.py", line 33, in <module>
print(hlines.shape)
AttributeError: 'NoneType' object has no attribute 'shape'
奇怪的是,如果我对代码进行了调整,以便不应用背景减法(注释第26行和更改第28行,以便它引用的是'frame'而不是'img_sub'),则一切正常。我想念什么?
我可以输出减去背景的视频流,并且效果正常。
我可以输出/打印(hlines)就好了。
“hlines”的终端输出示例
[[470 109 470 109]]
[[337 259 337 259]]
[[330 267 330 267]]
[[338 324 338 324]]
[[338 289 338 289]]]
但是,一旦我尝试使用hlines.shape属性,事情就会变得一团糟。
import cv2
import numpy as np
import imutils
np.set_printoptions(threshold=np.inf) #to print entire array, no truncation
LOWER_BOUND = 55 #cv2.threshold()
UPPER_BOUND = 255 #cv2.threshold()
CANNY_LOWER_BOUND = 10 #cv2.Canny()
CANNY_UPPER_BOUND = 250 #cv2.Canny()
MIN_LINE_LENGTH = 2 #HoughLinesP()
MAX_LINE_GAP = 100 #HoughLinesP()
HOUGH_THETA = np.pi/180 #HoughLinesP() angle resolution of the accumulator, radians
HOUGH_THRESHOLD = 25 #HoughLinesP()
HOUGH_RHO = 1 #HoughLinesP() rho, Distance resolution of the accumulator, pixels
#background subtraction parameter
bkgnd = cv2.bgsegm.createBackgroundSubtractorMOG()
camera =cv2.VideoCapture('/home/odroid/Desktop/python_scripts/test/test_images/Edited_Foam_Dispense_Short.mp4')
while(True):
(grabbed, frame) = camera.read()
img_sub = bkgnd.apply(frame)#, learningRate = 0.001)
canny_threshold = cv2.Canny(img_sub, CANNY_LOWER_BOUND, CANNY_UPPER_BOUND)
hlines = cv2.HoughLinesP(canny_threshold, HOUGH_RHO, HOUGH_THETA, MIN_LINE_LENGTH, MAX_LINE_GAP)
print(hlines)
print(hlines.shape)
#a,b,c = hlines.shape
#for k in range(a):
#print(hlines.shape)
#break
#cv2.line(frame, (hlines[k][0][0], hlines[k][0][1]), (hlines[k][0][2], hlines[k][0][3]), (0,255,0), 3, cv2.LINE_AA)
# print("getting hlines")
# break
cv2.imshow('canny_threshold', canny_threshold)
cv2.imshow("frame", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
camera.release()
cv2.destroyAllWindows()
任何建议,将不胜感激。
编辑:
@ivan_pozdeev指向我this question.
它看起来确实适用。但是,在尝试遵循他们的解决方案时,出现以下错误:
追溯(最近一次通话):
在第37行的文件“test3.py”中
对于h中的l:
TypeError:“NoneType”对象不可迭代
这是修改后的代码段:
hlines = cv2.HoughLinesP(canny_threshold, HOUGH_RHO, HOUGH_THETA, MIN_LINE_LENGTH, MAX_LINE_GAP)
for l in hlines:
leftx, boty, rightx, topy = l[0]
line = Line((leftx, boty), (rightx, topy))
line.draw(frame, (0, 255, 0), 2)
现在,如果我没有数据,这对我来说很有意义……但是我确实有将数据返回到hlines中。我可以使用print(hlines)语句将其打印出来。但是,它的格式与OpenCV 2.4不同...但是,现在让我想知道为什么它在另一个问题中起作用...
编辑2:
啊哈!取得进展。这是脚本(print(hlines))的输出,如果我只循环两次……即,当run_once = 0 while(run_once
None
[[[690 419 693 419]]
[[672 419 679 419]]
[[696 417 701 417]]
[[713 419 714 419]]
[[504 418 504 418]]
[[688 419 688 419]]
[[672 417 679 417]]
[[510 419 511 419]]
[[693 418 693 417]]
[[688 417 688 417]]
[[692 417 692 417]]
[[696 419 699 419]]
[[713 417 714 417]]
[[686 419 686 419]]
[[622 417 622 417]]
[[690 417 690 417]]
[[506 417 506 417]]
[[622 419 623 419]]
[[505 419 505 419]]
[[686 417 687 417]]
[[506 419 506 419]]
[[700 419 701 418]]
[[509 418 509 418]]
[[623 417 623 417]]
[[510 417 511 417]]
[[712 418 712 418]]
[[685 418 685 418]]
[[689 417 689 417]]
[[689 419 689 419]]
[[671 418 671 418]]
[[691 417 691 417]]]
因此,看起来像是第一行的hlines是“None”。我认为,这可以解释错误。但是,现在我需要弄清楚如何向hlines中添加“空行” ..
最佳答案
通过@ivan_pozdeev在上面发布的链接并检查返回类型为None可以解决此问题。
HoughLinesP函数在第一帧上返回一个空数组(返回“None”)。这会导致错误。添加检查可以解决该问题。
if hlines is None: #in case HoughLinesP fails to return a set of lines
#make sure that this is the right shape [[ ]] and ***not*** []
hlines = [[0,0,0,0]]
else:
for l in hlines:
leftx, boty, rightx, topy = l[0]
cv2.line(frame, (leftx, boty), (rightx, topy), (0, 255, 0), 2)
关于python - “NoneType”对象没有属性 'shape'…即使我可以将其打印出来,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43665300/