在另一台笔记本电脑上使用 CV2 程序时出现路径错误

Posted

技术标签:

【中文标题】在另一台笔记本电脑上使用 CV2 程序时出现路径错误【英文标题】:Path Error when using CV2 programm on another Laptop 【发布时间】:2020-05-13 06:50:41 【问题描述】:

我的笔记本电脑上有一个可以工作的 .exe,它通过 CV2 处理视频。当我在另一台笔记本电脑上打开 exe 时,UI 加载正常,但是一旦我选择视频,我就会收到以下错误:

cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv: :cvtColor'

通过谷歌快速搜索后,我发现视频文件路径一定有错误。但是我没有对文件路径进行硬编码,而是使用了VideoFile = askopenfilename(filetypes=[("Video Files", "*.mp4 *.MOV"),('All', '*')])(来自 tkinter)。所以文件路径不应该有错误(正如我所说的exe在我编程的笔记本电脑上工作正常)。 更新:我在第二台笔记本电脑上安装了 python,.py 可以顺利完成所有操作,但是如果我将其转换为 .exe,我会得到与以前相同的错误。这有什么意义? (我用pyinstaller把.py转成.exe)

class Thread(QThread):
    globals.global_vars()
    changePixmap = pyqtSignal(QImage)

    def run(self):
        cap = cv2.VideoCapture(globals.VideoFile)
        cap.set(cv2.CAP_PROP_POS_FRAMES, globals.start_frame)
        globals.frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

        while globals.Reset:
            try:
                cv2.waitKey(globals.Speed)
                _, frame = cap.read()

                hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
                lower_blue = np.array([globals.L_H, globals.L_S, globals.L_V])
                upper_blue = np.array([globals.U_H, globals.U_S, globals.U_V])
                mask = cv2.inRange(hsv, lower_blue, upper_blue)
                res = cv2.bitwise_and(frame, frame, mask=mask)
                blur = cv2.GaussianBlur(res, (15, 15), 0)
                blur = cv2.rectangle(blur, (globals.Left, globals.Upper), (globals.Right, globals.Under), (0, 0, 255), 2)

                [...]
                h, w, ch = blur.shape
                bytesPerLine = ch * w
                convertToFormat = QImage(blur.data, w, h, bytesPerLine, QImage.Format_RGB888)
                convertToFormat = convertToFormat.rgbSwapped()
                p = convertToFormat.scaled(640, 480, Qt.KeepAspectRatio)
                self.changePixmap.emit(p)

class MyWindow(QMainWindow):

    def __init__(self):
        super(MyWindow, self).__init__()
        self.resize(1300, 800)
        self.setWindowTitle("MainWindow")
        self.initUI()

    def setImage(self, image):
        self.label.setPixmap(QPixmap.fromImage(image))

    def initUI(self):
        globals.global_vars()
        [...]
        #Label to display video in
        self.label = QtWidgets.QLabel(self)
        self.label.setGeometry(QtCore.QRect(600, 130, 640, 480))
        [...]
    def clicked_menu(self, a):
        if a == 0:
            #get file path
            globals.VideoFile = askopenfilename(filetypes=[("Video Files", "*.mp4 *.MOV"),('All', '*')])
            th = Thread(self)
            th.changePixmap.connect(self.setImage)

我将 PyQt5 用于我的 UI,而 tkinter 仅用于 askyfilename 部分。

【问题讨论】:

出于调试目的,您能否在cap = cv2.VideoCapture(globals.VideoFile) 之前打印globals.VideoFile,以确保您获得的是有效路径? 我测试了它并在 askopenfilename 之后打印了 globals.VideoFile 并得到了正确的路径。 你也可以试试os.path.exists()作为文件名吗? 打印出“真” 我找到了一个Github issue,其中capcap.set(cv2.CAP_PROP_POS_FRAMES, globals.start_frame) 之后还没有准备好。我认为您需要通过轮询等待一段时间,直到它返回 True 【参考方案1】:

现在我已经在几台电脑上对其进行了测试,我确信 Windows 7 是问题所在。由于运行 .exe 对我来说很重要(从现在开始我将只使用 Win 10),因此我的问题不再需要解决。

【讨论】:

以上是关于在另一台笔记本电脑上使用 CV2 程序时出现路径错误的主要内容,如果未能解决你的问题,请参考以下文章

从另一个网络上的另一台计算机访问 db 时出现错误 #1045

电脑开机时出现另一程序正在使用此文件怎么办?

node js mongodb回调不起作用-下面的代码在我的笔记本电脑上有效,但在另一台PC上无效

如何在另一台Mac上运行Swift Terminal应用程序

qt + mysql 在另一台电脑上启动应用程序

在另一台电脑上运行 qt qml 应用程序