由于文件路径中的特殊字符,OpenCv imwrite不起作用

时间:2017-06-02 13:24:55

标签: python python-3.x opencv

当文件路径具有特殊字符时(例如“é”),我无法保存图像。

这是来自Python 3 shell的测试:

>>> cv2.imwrite('gel/test.jpg', frame)
True
>>> cv2.imwrite('gel/ééé/test.jpg', frame)
False
>>> cv2.imwrite('gel/eee/test.jpg', frame)
True

任何想法怎么做?

谢谢!

编辑:

不幸的是,@ PM2Ring和@DamianLattenero提出的所有建议似乎都不起作用:(

所以,我使用@ cdarke的解决方案,这是我的最终代码:

destination = 'gel/ééé/'
gel = 'test.jpg'
script_path = os.getcwd()
os.chdir(destination)
cv2.imwrite(gel, frame)
os.chdir(script_path)

4 个答案:

答案 0 :(得分:2)

尝试编码:

cv2.imwrite('gel/ééé/test.jpg'.encode('utf-8'), frame) # or just .encode(), 'utf-8' is the default

如果您正在使用Windows,可能使用:

cv2.imwrite("gel/ééé/test.jpg".encode("windows-1252"), frame)

或者现在根据你的utf-16窗口阅读@PM用户答案:

cv2.imwrite("gel/ééé/test.jpg".encode('UTF-16LE'), frame)

如果不适合你,请尝试:

ascii_printable = set(chr(i) for i in range(0x20, 0x7f))

def convert(ch):
    if ch in ascii_printable:
        return ch
    ix = ord(ch)
    if ix < 0x100:
        return '\\x%02x' % ix
    elif ix < 0x10000:
        return '\\u%04x' % ix
    return '\\U%08x' % ix

path = 'gel/ééé/test.jpg'

converted_path = ''.join(convert(ch) for ch in 'gel/ééé/test.jpg')

cv2.imwrite(converted_path, frame)

答案 1 :(得分:1)

您可以先使用OpenCV对图像进行编码,然后使用numpy tofile()方法将其保存,因为编码的图像是一维numpy ndarray:

is_success, im_buf_arr = cv2.imencode(".jpg", frame)

im_buf_arr.tofile('gel/ééé/test.jpg')

答案 2 :(得分:0)

编码问题。...困难但并非不可能

如果您有此字符串= 'テスト/abc.jpg'

您可以将像这样的字符编码为Windows ->

print('テスト/abc.jpg'.encode('utf-8').decode('unicode-escape'))

您会得到类似== 'ãã¹ã/abc.jpg'

的信息

然后,如果您想读取文件并使文件名可读且可用,则可以使用某些库来读取路径的文件名,然后更改编码->

#fname is like 'ãã¹ã/abc.jpg'

fname.encode('iso-8859-1').decode('utf-8'))#您的初始字符串的结果= 'テスト/abc.jpg'

答案 3 :(得分:0)

一行。

cv2.imencode(".jpg",frame)[1].tofile("gel/ééé/test.jpg")