pycharm程序运行问题

在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

不知道你这个问题是否已经解决, 如果还没有解决的话:


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^