如何从 Python OpenCV 中的指定 folder/directory 打开随机图像

How to open a random image from specified folder/directory in Python OpenCV

我希望我的程序从文件夹中随机打开一张图片。

这个有效:

import cv2
import os
import random

capture = cv2.imread(".Images/IMG_3225.JPEG")

但是当我想随机执行此操作时,它不起作用:

file = random.choice(os.listdir("./images/"))
capture = cv2.imread(file)

我收到以下错误:

cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\highgui\src\window.cpp:376: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'

我做错了什么??

试试这个:

import os
import cv2
import random


dirs = []
for i in os.listdir("images"):
    if i.endswith(".JPEG"):
        dirs.append(os.path.join("images", i))

pic = random.choice(dirs)

pic_name = pic.split("\")[-1]
pic = cv2.imread(pic)

cv2.imshow(pic_name, pic)

cv2.waitKey(0)

发生这种情况是因为 os.listdir returns 文件夹的内容。

具有此文件夹结构:

images/
    - a.png
    - b.png
    - c.png

这是预期的结果。

>>> os.listdir('images')
['a.png', 'b.png', 'c.png']

file实际上包含images/中的文件名,所以cv2.imread找不到文件,因为它在错误的地方查找。

您必须传递 cv2.imread 文件的路径:

IMAGE_FOLDER = './images'

filename = random.choice(os.listdir(IMAGE_FOLDER))
path = '%s/%s' % (IMAGE_FOLDER , filename)

capture = cv2.imread(path)

这是我们在处理它时通常会忽略的小错误之一。主要是因为os.listdirreturns一个文件夹的内容。当您使用 os.listdir 时,它只是 returns 文件名。结果是 运行ning 像 capture = cv2.imread("file_name.png") 而它应该是 capture = cv2.imread("path/file_name.png")

所以在工作的时候,尝试使用代码片段:

path = './images'
file = random.choice(os.listdir("./images/"))
capture = cv2.imread(os.path.join(path,file))

这将帮助您 运行 代码。