<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          OpenCV中讀取中文路徑、窗口命名中文、圖片加中文亂碼問題匯總

          共 6832字,需瀏覽 14分鐘

           ·

          2021-07-01 22:56

          點擊上方碼農(nóng)的后花園”,選擇星標” 公眾號

          精選文章,第一時間送達

          問題一:  
          當我們在PyCharm環(huán)境,使用OpenCV的cv2.imread(filename)方法讀取圖像,發(fā)現(xiàn)imread無法讀取中文文件,只能識別英文文件,就算執(zhí)行成功也不會輸出結(jié)果。
          當圖像保存文件夾filename 中的路徑或者圖像文件名包含漢字的時候,cv2.imread(filename)讀取不到圖像數(shù)據(jù),導致后續(xù)一系列對讀取的圖像進行操作都會無法進行,報錯。我們需要支持讀入中文文件,輸出中文文件。
          #1.解決opencv讀取中文路徑報錯的問題file_path1 = "D:\Project\Monet_traffic\圖片\哈兒.jpg"image = cv2.imread(filename=file_path1)print(Image.shape[0]) # 報錯cv2.imshow("1",image) #報錯


          原因分析: opencv的所有Python版本,cv2.imread(filename)方法都不支持中文路徑的文件讀入,所以說圖像根本沒有讀到,所以無法對圖像進行任何操作。

          解決辦法:使用OpenCV的cv2.imdecode(buf, flags)方法。
          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_img
          image = 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或者cv2.imshow顯示圖像窗口,將窗口顯示為中文時,會出現(xiàn)亂碼現(xiàn)象。
          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)



          原因分析:因為namedWindow和imshow的窗口名采用gbk編碼,而Python3默認UTF-8編碼,所以應該將中文轉(zhuǎn)成gbk編碼的格式。但是這樣轉(zhuǎn)換并不完美,大部分中文都不能轉(zhuǎn)換,無法顯示,建議還是使用英文命名窗口

          從根本上解決這一問題,目前有兩種方案:

          ①改用Python 2版本,代碼改為 cv.imshow(u'繪圖', img),字符串前加u
          ②改用C++開發(fā)環(huán)境


          問題三:  
          在圖片或者視頻中添加中文漢字,在OpenCV添加文字的方法putText()時,添加英文沒有問題,但是如果添加中文就會出現(xiàn)"???"的亂碼現(xiàn)象
          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

          PS1:OpenCV中putText方法支持的文字字體有:
          原因分析:opencv在視頻中通過putText函數(shù)能添加文字,但對于中文則無能為力,主要是因為編碼問題。

          解決辦法:Python中將OpenCV格式的numpy.ndarray圖片,轉(zhuǎn)換成PIL格式的'PIL.Image.Image圖片,使用PIL的圖片繪制中文,PIL格式的圖片可以指定字體文件,也就是說可以使用PIL實現(xiàn)中文的輸出。

          步驟:
          1. OpenCV圖片格式轉(zhuǎn)換成PIL的圖片格式

          2. 使用PIL的ImageDraw.Draw.text繪制添加文字

          3. 將添加完文字的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為false if 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))) / 2 cv2.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下載使用。


          代碼下載和環(huán)境設置

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



                                                               分享給更多朋友,轉(zhuǎn)發(fā)點贊在看

          瀏覽 305
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美午夜精品成人片在线播放 | 一区二区三区四区五区六区七区 | 日本久久一级片 | 成人毛片一区二区三区 | 国产a级久久 |