OpenCV中讀取中文路徑、窗口命名中文、圖片加中文亂碼問題匯總
精選文章,第一時間送達
#1.解決opencv讀取中文路徑報錯的問題file_path1 = "D:\Project\Monet_traffic\圖片\哈兒.jpg"image = cv2.imread(filename=file_path1)print(Image.shape[0]) # 報錯cv2.imshow("1",image) #報錯


file_path1 = "D:\Project\Monet_traffic\圖片\哈兒.jpg"image = cv2.imread(filename=file_path1)# # print(Image.shape[0]) # 報錯# cv2.imshow("1",image) #報錯#讀取圖像,解決imread不能讀取中文路徑路徑的問題def cv_imread(file_path):#imdedcode讀取的是RGB圖像cv_img = cv2.imdecode(np.fromfile(file_path,dtype=np.uint8),-1)return cv_imgimage = cv_imread(file_path1)print("圖像的高度:",image.shape[0],"圖像的寬度:",image.shape[1])cv2.imshow("image", image)

#2.輸出中文文件,解決輸出中文文件亂碼的問題# image1為圖片對象,filepath為輸出圖片路徑file_path2 = "D:\Project\Monet_traffic\圖片\蘇菲.png"cv2.imwrite(filename=file_path2,img=image) #執(zhí)行成功,但是圖片未保存成功到本地cv2.imencode('.png', image)[1].tofile(file_path2) #執(zhí)行保存成功
cv2.namedWindow(winname="image", flags=cv2.WINDOW_AUTOSIZE) # 或者數(shù)字0# cv2.resizeWindow("window", 480, 320) #設置圖片顯示窗口大小# 讀入圖片image_path = r"D:\Project\Monet_traffic\data\photo\3.jpg"image = cv2.imread(image_path)print(image.shape) # 圖片大小print(type(image))# 改變圖片大小,fx代表對圖片的長進行縮放尺寸系數(shù)# image = cv2.resize(image,None,fx=0.5,fy=0.5)# 顯示圖片:窗口名,顯示圖片# cv2.imshow(‘窗口標題’,image),如果前面沒有cv2.namedWindow,自動先執(zhí)行一個cv2.namedWindow()cv2.imshow(winname='image', mat=image)

#讀入圖片image = cv2.imread(r"D:\Project\Monet_traffic\data\photo\3.jpg")#編碼格式轉(zhuǎn)換def zh_ch(string):return string.encode("gbk").decode('UTF-8', errors='ignore')cv2.namedWindow(winname=zh_ch('圖片'))cv2.imshow(zh_ch('圖片'), image)cv2.waitKey(0)

從根本上解決這一問題,目前有兩種方案:
cv2.namedWindow(winname="image", flags=cv2.WINDOW_AUTOSIZE) # 或者數(shù)字0# cv2.resizeWindow("window", 480, 320) #設置圖片顯示窗口大小# 讀入圖片image_path = r"D:\Project\Monet_traffic\data\photo\3.jpg"image = cv2.imread(image_path)print(image.shape) # 圖片大小print(type(image))# 改變圖片大小,fx代表對圖片的長進行縮放尺寸系數(shù)# image = cv2.resize(image,None,fx=0.5,fy=0.5)# 顯示圖片:窗口名,顯示圖片# cv2.imshow(‘窗口標題’,image),如果前面沒有cv2.namedWindow,自動先執(zhí)行一個cv2.namedWindow()cv2.imshow(winname='image', mat=image)# 圖片上畫框cv2.rectangle(img=image, pt1=(285, 40), pt2=(350, 120), color=(0, 255, 0), thickness=2)# 圖片上添加文字cv2.putText(img=image,text="哈兒", org=(275 , 60), fontFace=cv2.FONT_HERSHEY_PLAIN, fontScale=2.5, color=(0, 0, 255), thickness =2)cv2.imshow(winname='image', mat=image


解決辦法:Python中將OpenCV格式的numpy.ndarray圖片,轉(zhuǎn)換成PIL格式的'PIL.Image.Image圖片,使用PIL的圖片繪制中文,PIL格式的圖片可以指定字體文件,也就是說可以使用PIL實現(xiàn)中文的輸出。
OpenCV圖片格式轉(zhuǎn)換成PIL的圖片格式
使用PIL的ImageDraw.Draw.text繪制添加文字
將添加完文字的PIL格式圖片轉(zhuǎn)換為OpenCV格式圖片進行展示
cv2.namedWindow(winname="image", flags=cv2.WINDOW_AUTOSIZE) # 或者數(shù)字0# cv2.resizeWindow("window", 480, 320) #設置圖片顯示窗口大小# 讀入圖片image_path = r"D:\Project\Monet_traffic\data\photo\3.jpg"image = cv2.imread(image_path)print(image.shape) # 圖片大小print(type(image))# 改變圖片大小,fx代表對圖片的長進行縮放尺寸系數(shù)# image = cv2.resize(image,None,fx=0.5,fy=0.5)# 顯示圖片:窗口名,顯示圖片# cv2.imshow(‘窗口標題’,image),如果前面沒有cv2.namedWindow,自動先執(zhí)行一個cv2.namedWindow()cv2.imshow(winname='image', mat=image)# 圖片上畫框cv2.rectangle(img=image, pt1=(285, 40), pt2=(350, 120), color=(0, 255, 0), thickness=2)# 添加中文# 轉(zhuǎn)換為PIL的image圖片格式,使用PIL繪制文字,再轉(zhuǎn)換為OpenCV的圖片格式def image_add_text(img1, text, left, top, text_color, text_size):# 判斷圖片是否為ndarray格式,轉(zhuǎn)為成PIL的格式的RGB圖片if isinstance(img1, np.ndarray):image = Image.fromarray(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))print(type(image))# 創(chuàng)建一個可以在給定圖像上繪圖的對象draw = ImageDraw.Draw(image)# 參數(shù)依次為 字體、字體大小、編碼font_style = ImageFont.truetype("font/simsun.ttc", text_size, encoding='utf-8')# 參數(shù)依次為位置、文本、顏色、字體draw.text((left, top), text, text_color, font=font_style)return cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)image = image_add_text(image, "哈兒", 225, 50, (255, 0, 0), 40)cv2.imshow(winname='image', mat=image)

# 轉(zhuǎn)換為PIL的image圖片格式,使用PIL繪制文字,再轉(zhuǎn)換為OpenCV的圖片格式def image_add_text(img1, text, left, top, text_color, text_size):# 判斷圖片是否為ndarray格式,轉(zhuǎn)為成PIL的格式的RGB圖片if isinstance(img1, np.ndarray):image = Image.fromarray(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))print(type(image))# 創(chuàng)建一個可以在給定圖像上繪圖的對象draw = ImageDraw.Draw(image)# 參數(shù)依次為 字體、字體大小、編碼font_style = ImageFont.truetype("font/simsun.ttc", text_size, encoding='utf-8')# 參數(shù)依次為位置、文本、顏色、字體draw.text((left, top), text, text_color, font=font_style)return cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)video_path = r'D:\Project\Monet_traffic\data\video\test.mp4'capture = cv2.VideoCapture(video_path)# 判斷VideoCaputre對象是否成功打開if capture.isOpened():print('已經(jīng)打開了視頻文件')while (True):fps = capture.get(cv2.CAP_PROP_FPS) # 返回視頻的fps--幀率width = capture.get(cv2.CAP_PROP_FRAME_WIDTH) # 返回視頻的寬height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT) # 返回視頻的高print('fps:', fps, 'width:', width, 'height:', height)# 檢測圖片的起始時間t1 = time.time()# 讀取某一幀ret, frame = capture.read() # 如果正確讀取幀,ret為True,否則ret為falseif not ret:print("Can't receive frame (stream end?). Exiting ...")else:frame = image_add_text(frame, "哈兒", 225, 50, (255, 0, 0), 40)# 檢測圖片的結(jié)束時間t2 = time.time()fps = (fps + (1. / (t2 - t1))) / 2cv2.putText(img=frame, text=str(fps), org=(275, 60), fontFace=cv2.FONT_HERSHEY_PLAIN,fontScale=1.5, color=(0, 0, 255),thickness=2)cv2.imshow("frame", frame)if cv2.waitKey(1) & 0xff == ord('q'): # waitKey(0):break# 釋放對象capture.release()cv2.destroyAllWindows()else:print('視頻文件打開失敗')
PS2: 推薦一個RGB和字體下載的網(wǎng)站
RGB 對應的顏色可以使用 https://www.sioe.cn/yingyong/yanse-rgb-16/進行查看。

字體下載可以使用http://www.font5.com.cn/font_download.php?id=150&part=1237886897下載使用。

完整論文以及代碼下載,后臺回復關鍵字:OpenCV,即可獲取數(shù)據(jù)集和源代碼。
評論
圖片
表情
