2017-06-02 35 views
3

當文件路徑具有特殊字符(例如「é」)時,我無法保存圖像。由於文件路徑中的特殊字符,OpenCv imwrite不起作用

下面是從Python 3的外殼測試:

>>> 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) 
+0

哪個操作系統?你試過'cv2.imwrite('gel /ééé/ test.jpg'.encode(),frame)'? –

+0

Windows 10(使用Python 3.6.1) 我試過了,它仍然沒有起作用... 'TypeError:壞的參數類型的內置操作',當我打印時:'b'gel/\ xc3 \ xa9 \ xc3 \ xa9 \ xc3 \ xa9/test.jpg'' – TeeVy

+1

由於非ASCII字符在目錄名中,因此您可以使用'os.chdir('gel /ééé')',然後使用'cv2。 imwrite('test.jpg',frame)'?它的討厭和醜陋,但應該工作。 – cdarke

回答

1

嘗試與編碼:

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) 
+0

我們已經嘗試過。 :)'str.encode'使用的默認編碼是UTF-8。但是,Windows使用UTF-16,我非常肯定它需要小端(我不使用Windows,除非我無法避免它)。 –

+0

@ PM2Ring aaaah我明白了,你是否試過用.encode(「windows-1252」))?我更新了答案 –

+0

順便說一句,最好修改舊的答案,而不是刪除並創建一個新的答案。你應該沒問題,但是如果你經常刪除東西,那麼「系統」會懲罰你。不過,在修復問題時臨時刪除答案也可以。 –

相關問題