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

svujldwt  于 2023-10-24  发布在  其他
关注(0)|答案(6)|浏览(142)

我不能保存图像时,文件路径有特殊字符(如“é”的例子)。
下面是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)
6qqygrtg

6qqygrtg1#

你可以先用OpenCV编码图像,然后用numpy tofile()方法保存它,因为编码后的图像是一个一维numpy ndarray:

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

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

kxeu7u2r2#

尝试使用以下代码编码:

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)

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

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)
hgqdbh6s

hgqdbh6s3#

排成一行。
cv2.imencode(".jpg",frame)[1].tofile("gel/ééé/test.jpg")

azpvetkf

azpvetkf4#

以下是我的写作和阅读功能:

def read_image(path):
    return cv2.imdecode(np.fromfile(path,dtype=np.uint8), -1)

def save_image(img, path):
    cv2.imencode(".png", img)[1].tofile(path+'/your_file_name.png')
qvtsj1bj

qvtsj1bj5#

编码问题....困难但并非不可能
如果你有这个字符串= 'テスト/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'

jv2fixgn

jv2fixgn6#

试试这个

img_encoded = cv2.imencode(".jpg",frame)[1]
with open("ééé/test.jpg", "wb") as f:
    f.write(img_encoded)

相关问题