问题描述
完整错误是:
OpenCV: out device of bound (0-0): 1
OpenCV: camera Failed to properly initialize!
Traceback (most recent call last):
File "/Users/syedrishad/PycharmProjects/OpenCvpython/venv/project1.py",line 60,in <module>
imgResult = img.copy()
AttributeError: 'nonetype' object has no attribute 'copy'
```
完整代码是:
```import cv2
import numpy as np
frameWidth = 640
frameHeight = 480
cap = cv2.VideoCapture(1)
cap.set(3,frameWidth)
cap.set(4,frameHeight)
cap.set(10,150)
myColors = [[78,119,70,255,97,255],[63,108,44,118],[0,179,69,100,[90,48,118,255]]
myColorValues = [[51,153,## BGR
[255,0],[255,0]]
myPoints = [] ## [x,y,colorId ]
def findColor(img,myColors,myColorValues):
imgHSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
count = 0
newPoints = []
for color in myColors:
lower = np.array(color[0:3])
upper = np.array(color[3:6])
mask = cv2.inRange(imgHSV,lower,upper)
x,y = getContours(mask)
cv2.circle(imgResult,(x,y),15,myColorValues[count],cv2.FILLED)
if x != 0 and y != 0:
newPoints.append([x,count])
count += 1
# cv2.imshow(str(color[0]),mask)
return newPoints
def getContours(img):
contours,hierarchy = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
x,w,h = 0,0
for cnt in contours:
area = cv2.contourArea(cnt)
if area > 500:
# cv2.drawContours(imgResult,cnt,-1,(255,0),3)
peri = cv2.arcLength(cnt,True)
approx = cv2.approxpolyDP(cnt,0.02 * peri,True)
x,h = cv2.boundingRect(approx)
return x + w // 2,y
def drawOnCanvas(myPoints,myColorValues):
for point in myPoints:
cv2.circle(imgResult,(point[0],point[1]),10,myColorValues[point[2]],cv2.FILLED)
while True:
success,img = cap.read()
imgResult = img.copy()
newPoints = findColor(img,myColorValues)
if len(newPoints) != 0:
for newP in newPoints:
myPoints.append(newP)
if len(myPoints) != 0:
drawOnCanvas(myPoints,myColorValues)
cv2.imshow("Result",imgResult)
if cv2.waitKey(1) and 0xFF == ord('q'):
break ```
如何解决此错误?任何帮助将不胜感激,我一直在尝试并且现在一个星期都没有找到答案。我不明白为什么它不起作用。我查看了此错误的其他示例,但所有解决方案均无效。
再次感谢您的帮助。
解决方法
导致错误的行:
password
使用上一行中定义的imgResult = img.copy()
:
img
read
文档说明:
方法/函数在一次调用中将VideoCapture :: grab()和VideoCapture :: retrieve()组合在一起。这是读取视频文件或从解码中捕获数据并返回刚抓取的帧的最方便的方法。如果没有抓取任何帧(相机已断开连接,或者视频文件中没有其他帧),则方法返回false,函数返回NULL指针。
由于没有读取数据,显然success,img = cap.read()
是img
。
更改为:
None
还要检查是什么原因导致没有抓取帧,或者:
- 相机已断开连接(检查所有驱动程序以确保已安装并检测到它)
- 视频文件中没有其他帧
我猜您正在尝试使用网络摄像头。请将值更改为 0,因为它用于使用网络摄像头。祝你有美好的一天。
const preventPasteNegative = (e) => {
const clipboardData = e.clipboardData || window.clipboardData;
const pastedData = parseFloat(clipboardData.getData('text'));
if (pastedData < 0) {
e.preventDefault();
}
};
<input
type="number"
min="0"
onPaste={preventPasteNegative}
onKeyPress={preventMinus}
/>