在pycharm中运行程序,该程序可以调用电脑摄像头。
在运行程序时显示如下错误
Traceback (most recent call last):
File "E:/shiyan/main.py", line 37, in <module>
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#R=G=B时,颜色显示灰色
cv2.error: OpenCV(4.5.4) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
根据网上的方法,第一个路径中有中文,我修改了之后还是有这个问题,第二个是图片的格式不正确,但是我这个pycharm的程序并没有识别图片,所以不知道怎么解决。
下面是整个程序
import numpy as np
import cv2
import cv2.aruco as aruco
import math
import time
import socket
mtx = np.array([
[2946.48, 0, 1980.53],
[ 0, 2945.41, 1129.25],
[ 0, 0, 1],
])
dist = np.array( [0.226317, -1.21478, 0.00170689, -0.000334551, 1.9892] )
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
cap = cv2.VideoCapture(1)
font = cv2.FONT_HERSHEY_SIMPLEX
while True:
ret, frame = cap.read()
frame1 = cv2.flip(frame, -1)
#out.write(frame)
cv2.waitKeyEx(100)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # R=G=B时,颜色显示灰色
aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)#Aruco标识码种类
aruco_dict1 = aruco.Dictionary_get(aruco.DICT_5X5_250)#创建一个5x5二进制ArUco标记,并且词典中将有250个唯一的ArUco标记ID
parameters = aruco.DetectorParameters_create()
corners, ids, rejectedImgPoints = aruco.detectMarkers(gray, aruco_dict1, parameters=parameters)
corners1, ids1, rejectedImgPoints1 = aruco.detectMarkers(gray, aruco_dict, parameters=parameters)
if ids is not None:
rvec, tvec, _ = aruco.estimatePoseSingleMarkers(corners, 0.1, mtx, dist)
(rvec - tvec).any()
for i in range(len(ids)):
ids_corners = corners[i]
ids_center = ids_corners[0]
corner = [ids_center[0],ids_center[1],ids_center[2],ids_center[3]]
corner_x1 = ids_center[0][0]
corner_x2 = ids_center[1][0]
corner_x3 = ids_center[2][0]
corner_x4 = ids_center[3][0]
corner_y1 = ids_center[0][1]
corner_y2 = ids_center[1][1]
corner_y3 = ids_center[2][1]
corner_y4 = ids_center[3][1]
duijiao = (corner_x4-corner_x1)*(corner_x4-corner_x1)+(corner_y4-corner_y1)*(corner_y4-corner_y1)
d = math.sqrt(duijiao)
if corner_x2 > corner_x3:
if corner_y2 > corner_y3:
qd = (corner_y2-corner_y3)/d
if qd < -1:
qd = -1
if qd > 1:
qd = 1
sinta = math.asin(abs(qd))
sinta1 = 90 + math.degrees(sinta)
else :
qa = (corner_x2 - corner_x3) / d
if qa < -1:
qa = -1
if qa > 1:
qa = 1
sinta = math.asin(abs(qa))
sinta1 = math.degrees(sinta)
if corner_x2 < corner_x3:
if corner_y2 > corner_y3:
qa = (corner_y2 - corner_y3) / d
if qa < -1:
qa = -1
if qa > 1:
qa = 1
sinta = math.asin(abs(qa))
sinta1 = 270 - math.degrees(sinta)
else :
qd = (corner_x2 - corner_x3) / d
if qd < -1:
qd = -1
if qd > 1:
qd = 1
sinta = math.asin(abs(qd))
sinta1 = 360 - math.degrees(sinta)
#sinta1 = math.atan((corner_x4-corner_x1)/(corner_y4-corner_y1))
#sinta2 = math.degrees(sinta)
sinta2 = math.trunc(sinta1)
#sinta4 = abs(sinta3)
corner_x = (corner_x1+corner_x2+corner_x3+corner_x4)/4
corner_y = (corner_y1+corner_y2+corner_y3+corner_y4)/4
#print(corner_x1,corner_x4,corner_y1,corner_y4)
print(ids[i][0],corner_x,corner_y,sinta1)
#print(ids[i],corner)
x2 = math.trunc(corner_x)
y2 = math.trunc(corner_y)
x3 = str(x2)
y3 = str(y2)
id = str(ids[i][0])
sintaa = str(sinta2)
send_data = []
send_data.append('q')
send_data.append(id)
send_data.append('x')
send_data.append(x3)
send_data.append('y')
send_data.append(y3)
send_data.append('z')
send_data.append(sintaa)
send_data.append('t')
send_data.append('a')
x4 = "".join(send_data)
print("send position:")
print(x4)
print("the position is sended")
ip_port = ('127.0.0.1', 9987)
q = 0
while q < 1:
q += 1
udp_socket.sendto(x4.encode('utf-8'), ip_port)
#time.sleep(0.03)
for i in range(rvec.shape[0]):
aruco.drawAxis(frame, mtx, dist, rvec[i, :, :], tvec[i, :, :], 0.03)
aruco.drawDetectedMarkers(frame, corners)
if ids1 is not None:
rvec1, tvec1, _ = aruco.estimatePoseSingleMarkers(corners1, 0.1, mtx, dist)
(rvec1 - tvec1).any() # get rid of that nasty numpy value array error
point1 = np.average(corners1[0][0], axis=0)
global center1
x1 = point1[0]
y1 = point1[1]
center1 = [x1, y1]
'''
else:
cv2.putText(frame, "No Cars", (0, 64), font, 1, (0, 255, 0), 2, cv2.LINE_AA)
'''
cv2.imshow('corners',frame1)
cap那行换0试一下,如果你电脑只有一个摄像头,应该默认是0
不知道你这个问题是否已经解决, 如果还没有解决的话: