在另一台笔记本电脑上使用 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,其中cap
在cap.set(cv2.CAP_PROP_POS_FRAMES, globals.start_frame)
之后还没有准备好。我认为您需要通过轮询等待一段时间,直到它返回 True
。
【参考方案1】:
现在我已经在几台电脑上对其进行了测试,我确信 Windows 7 是问题所在。由于运行 .exe 对我来说很重要(从现在开始我将只使用 Win 10),因此我的问题不再需要解决。
【讨论】:
以上是关于在另一台笔记本电脑上使用 CV2 程序时出现路径错误的主要内容,如果未能解决你的问题,请参考以下文章
从另一个网络上的另一台计算机访问 db 时出现错误 #1045
node js mongodb回调不起作用-下面的代码在我的笔记本电脑上有效,但在另一台PC上无效