OpenCV - 将图像保存到指定的文件夹

39

我正在学习OpenCV和Python。我从我的网络摄像头中捕获了一些图像并保存了下来。但是它们默认保存在本地文件夹中。我想将它们保存到另一个直接路径的文件夹中。我该怎么做?


1
我想指出的是,您可能需要创建要保存图像的文件夹(即它必须存在),否则,在调用imwrite时将会像什么都没有发生一样。 - nbro
8个回答

63

ebeneditos提供的解决方案完美运作。

但是,如果您在大段代码片段的几个部分中都有cv2.imwrite(),并且您想更改保存图像的路径,则必须逐个更改每个cv2.imwrite()的路径。

正如Soltius所述,这里有一种更好的方式。声明一个路径,并将其作为字符串传递到cv2.imwrite()中。

import cv2
import os
img = cv2.imread('1.jpg', 1)
path = 'D:/OpenCV/Scripts/Images'
cv2.imwrite(os.path.join(path , 'waka.jpg'), img)
cv2.waitKey(0)

现在,如果你想修改路径,只需更改path变量即可。

根据Kallz提供的解决方案进行编辑。


14

你可以使用OpenCV的函数imwrite来完成:

import cv2
cv2.imwrite('Path/Image.jpg', image_name)

1
而且更好的做法是将您的路径声明为字符串变量,以防您想要更改它并且正在使用大量的imwrite()函数。 - Soltius
这段代码在Windows 10上无法运行。我已经测试过了。文件夹没有被创建,我的意思是名为“Path”的文件夹,你能告诉我为什么吗? - Shahryar
3
@Shahryar,如果文件夹不存在,cv2.imwrite()不会创建该文件夹。您需要检查文件夹是否存在,如果存在,则写入其中;否则,请使用os.makedir()创建它。 - Anidh Singh

10

Jeru Luke提供的答案只适用于Windows系统,如果我们在其他操作系统(如Ubuntu)上尝试,则不会出现错误,但图像将保存在目标位置或路径上。

在Windows中运行但在Ubuntu中无法工作

  import cv2
  img = cv2.imread('1.jpg', 1)
  path = '/tmp'
  cv2.imwrite(str(path) + 'waka.jpg',img)
  cv2.waitKey(0)

我运行了上述代码,但是图片没有保存到目标路径。后来我发现我们通常使用 OS 模块来添加路径,而该方法不正确。
示例:
 import os
 final_path = os.path.join(path_1,path_2,path_3......)

在Ubuntu和Windows中工作

 import cv2
 import os
 img = cv2.imread('1.jpg', 1)
 path = 'D:/OpenCV/Scripts/Images'
 cv2.imwrite(os.path.join(path , 'waka.jpg'),img)
 cv2.waitKey(0)

那段代码在Windows和Ubuntu上都可以正常工作 :)


2
加1分给这个洞察力,也不要忘了提到它 :) - Jeru Luke
非常适用于Ubuntu用户。但是我浪费了一些时间,因为我把“路径”提供为“〜/ ... / ... / src / final_dir /”,而我只需要使用“final_dir /”。 - Pe Dro

7

谢谢大家。你们的方法都很好。我想分享另一种解决问题的方法。我使用了 os.chdir(path) 函数来将本地目录更改为路径。之后我正常保存了图片。


3
你可以通过增加计数器,在循环中使用这个简单的代码。
cv2.imwrite("C:\\path\\where you\\want to save\\frame%d.jpg" % count, image)

图像将以名称行保存在文件夹中:frame0.jpgframe1.jpgframe2.jpg等。


1

成功了!简单的修复。你只需要在目录中预先设置好空文件夹,它就可以将图像写入其中。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

0

这是一种更明显的方法,使用简单的f'string',而不是os.join - 加上一些额外的功能:

import cv2
img = cv2.imread('yourfile.jpg')
path = 'C:/OpenCV/Scripts/Images'
name = '/epic_img_title.jpg'
# write the file
cv2.imwrirte(f'{path}{name}', img)

f字符串非常简洁易懂。此外,您可以随时更改格式化的变量,非常方便!

如果您要保存大量图像并想迭代每个图像的名称:

import cv2
img = cv2.imread('yourfile.jpg')
def save_my_img(frame_count, img):
    path = 'C:/OpenCV/Scripts/Images'
    name = f'/img_title_{frame_count}.jpg'
    cv2.imwrite(os.path.join(path, name), img)

# give it a call
save_my_img(1, img)

稍后再拉取它...

def read_saved_img(frame_count):
    path = 'C:/OpenCV/Scripts/Images'
    name = f'/img_title_{frame_count}.jpg'
    img = cv2.imread(f'{path}{name}')
    # img is now an array, so let's just return it
    return img

# give it a call
cv2_image_array = read_saved_img(1) 

# random variable 'cv2_image_array' to hold 
# the array that was returned. Now you can
# edit it like any other image you cv2.imread()

1
这可能很“简单”,但是存在隐藏的问题。首先,如果反斜杠位于错误的字母之前,它们将被解释为转义代码。尝试 foo = "bar\foo",然后查看 foo 的值。您需要手动转义它们或使用原始字符串文字。其次,这不是非常跨平台的。如果不小心,您可能会得到双反斜杠或没有反斜杠。有一个原因,像 os.path.joinpathlib 这样的东西存在:创建路径比大多数人预期的要棘手。正确通常比简单更重要。 - Chris
请不要使用粗俗语言,即使是简写形式也不行。再次强调,os.pathpathlib存在很好的理由。轻率地忽略它们是幼稚的。使用字符串而不是内置模块也可能存在_安全_问题。想象一下,您想将用户输入限制为相对于给定路径,因此执行类似于if not user_input.startswith("/some/safe/path")...的安全措施。那么,如果用户输入/some/safe/path/../../../root会怎样呢?标准库中的模块可以轻松解决这个问题。 - Chris
除了不确定你所说的亵渎之外,其他方面你的观点在其他用例中都是有道理的。做得好。 - JohnSmith2000

0

如果您是Mac用户并且正在使用OpenCV

import cv2

cv2.imwrite('path_to_folder/image.jpg',image)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接