Python 属性错误:';非类型';对象没有属性';形状';/将多重轮廓框转换为奇异轮廓框
你好,早上好 我是python和opencv的新手,所以如果我听起来不专业,我会提前道歉 我正在尝试检测微型断路器并确定其尺寸。然而,这个错误不断出现。 AttributeError:“非类型”对象没有属性“形状” 我在这个论坛和其他网站上做了几次搜索,大多数都声称视频路径是问题所在,所以我试图调整或改变捕获到视频流的方式,但没有结果 代码如下:Python 属性错误:';非类型';对象没有属性';形状';/将多重轮廓框转换为奇异轮廓框,python,opencv,attributeerror,Python,Opencv,Attributeerror,你好,早上好 我是python和opencv的新手,所以如果我听起来不专业,我会提前道歉 我正在尝试检测微型断路器并确定其尺寸。然而,这个错误不断出现。 AttributeError:“非类型”对象没有属性“形状” 我在这个论坛和其他网站上做了几次搜索,大多数都声称视频路径是问题所在,所以我试图调整或改变捕获到视频流的方式,但没有结果 代码如下: import cv2 from collections import deque from scipy.spatial import distanc
import cv2
from collections import deque
from scipy.spatial import distance as dist
from imutils import perspective
import numpy as np
import argparse
import imutils
import math
import time
font = cv2.FONT_HERSHEY_SIMPLEX
def midpoint(ptA, ptB):
return ((ptA[0] + ptB[0]) * 0.5, (ptA[1] + ptB[1]) * 0.5)
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video", help="path to the (optional) video file")
args = vars(ap.parse_args())
sensitivity = 43
greyLower = np.array([96,0,176-sensitivity])
greyUpper = np.array([180,sensitivity,255])
pixelsPerMetric = None
KNOWN_WIDTH = 81
if not args.get("video", False):
camera = cv2.VideoCapture(0)
else:
camera = cv2.VideoCapture(args["video"])
while True:
(grabbed, frame) = camera.read()
if args.get("video") and not grabbed:
break
frame = imutils.resize(frame, width=600)
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv,greyLower, greyUpper)
mask = cv2.erode(mask, None, iterations=2)
mask = cv2.dilate(mask, None, iterations=2)
(_, contours, hierarchy) = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
center = None
for pic, contour in enumerate(contours):
if len(contours) > 0:
c = max(contours, key =cv2.contourArea)
x,y,w,h = cv2.boundingRect(contour)
rect = (x+w, y+h)
rect = cv2.minAreaRect(c)
box = cv2.boxPoints(rect)
box = np.int0(box)
box = perspective.order_points(box)
for (x, y) in box:
frame = cv2.rectangle(frame,(int(x),int(y)),(int(x+w), int(y+h)),(0,0,139),2)
# unpack the ordered bounding box, then compute the midpoint
# between the top-left and top-right coordinates, followed by
# the midpoint between bottom-left and bottom-right coordinates
(tl, tr, br, bl) = box
(tltrX, tltrY) = midpoint(tl, tr)
(blbrX, blbrY) = midpoint(bl, br)
# compute the midpoint between the top-left and top-right points,
# followed by the midpoint between the top-righ and bottom-right
(tlblX, tlblY) = midpoint(tl, bl)
(trbrX, trbrY) = midpoint(tr, br)
# draw the midpoints on the image
cv2.circle(frame, (int(tltrX), int(tltrY)), 5, (255, 0, 0), -1)
cv2.circle(frame, (int(blbrX), int(blbrY)), 5, (255, 0, 0), -1)
cv2.circle(frame, (int(tlblX), int(tlblY)), 5, (255, 0, 0), -1)
cv2.circle(frame, (int(trbrX), int(trbrY)), 5, (255, 0, 0), -1)
# draw lines between the midpoints
cv2.line(frame, (int(tltrX), int(tltrY)), (int(blbrX), int(blbrY)),
(255, 0, 255), 2)
cv2.line(frame, (int(tlblX), int(tlblY)), (int(trbrX), int(trbrY)),
(255, 0, 255), 2)
# compute the Euclidean distance between the midpoints
dA = dist.euclidean((tltrX, tltrY), (blbrX, blbrY))
dB = dist.euclidean((tlblX, tlblY), (trbrX, trbrY))
# if the pixels per metric has not been initialized, then
# compute it as the ratio of pixels to supplied metric
# (in this case, inches)
# compute the size of the object
dimA = dA / KNOWN_WIDTH
dimB = dB / KNOWN_WIDTH
if rect >300:
frame = cv2.rectangle(frame,(int(x),int(y)),(int(x+w), int(y+h)),(0,0,139),2)
cv2.putText(frame,"MCB",(x,y),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,0,139))
# draw the object sizes on the image
cv2.putText(frame, "{:.1f}in".format(dimA),
(int(tltrX - 15), int(tltrY - 10)), cv2.FONT_HERSHEY_SIMPLEX,
0.65, (255, 255, 255), 2)
cv2.putText(frame, "{:.1f}in".format(dimB),
(int(trbrX + 10), int(trbrY)), cv2.FONT_HERSHEY_SIMPLEX,
0.65, (255, 255, 255), 2)
cv2.imshow("Frame", frame)
cv2.imshow("Mask", mask)
key = cv2.waitKey(10) & 0xFF
if key == ord("q"):
break
camera.release()
cv2.destroyAllWindows()
该代码通过检测MCB的hsv颜色代码(灰色),并使用中点来声明尺寸(参考pyimages)
我遇到的另一个问题是,我试图创建一个矩形框用于检测,而不是多个。因此,我试图设置轮廓来检测hsv代码的最大区域,但是没有达到预期的结果
任何帮助或建议都是有用的,我愿意接受任何批评,因为我想更多地了解python并扩展这方面的专业知识
多谢各位
编辑:
完全回溯:
Traceback (most recent call last):
File "/Users/mac/Desktop/Control EZ/Test/Detect box.py", line 37, in <module>
frame = imutils.resize(frame, width=600)
File "/usr/local/lib/python2.7/site-packages/imutils/convenience.py", line 69, in resize
(h, w) = image.shape[:2]
AttributeError: 'NoneType' object has no attribute 'shape'
回溯(最近一次呼叫最后一次):
文件“/Users/mac/Desktop/Control EZ/Test/Detect box.py”,第37行,在
frame=imutils.resize(frame,width=600)
文件“/usr/local/lib/python2.7/site packages/imutils/concility.py”,第69行,调整大小
(h,w)=图像形状[:2]
AttributeError:“非类型”对象没有属性“形状”
在这一行:
(grabbed, frame) = camera.read()
变量frame
在此设置为无,因此尝试调整(不存在的)图像的大小失败。我对你的相机类一无所知,但当没有帧数据可读取时,可能会发生这种情况。None
对象没有形状,甚至没有数据;基本上没什么
看起来您正在检查
变量
,但仅在某些情况下。如果抓取的为假,也许你应该继续你能在你的问题中包含完整的回溯吗?完成,谢谢你的提醒。实际上我正在使用笔记本电脑网络摄像头。我知道相机的边框设置为“无”,这就是为什么我尝试使用视频流,但仍然没有得到任何结果。