前言
OpenCV是一種強(qiáng)大的計(jì)算機(jī)視覺(jué)庫(kù),廣泛用于圖像處理和計(jì)算機(jī)視覺(jué)應(yīng)用。本文將介紹OpenCV中的窗口交互功能,重點(diǎn)關(guān)注鼠標(biāo)和鍵盤(pán)的操作,以及如何添加窗口控件來(lái)實(shí)現(xiàn)更豐富的用戶(hù)體驗(yàn)。
一、鼠標(biāo)操作
1.1 鼠標(biāo)操作簡(jiǎn)介
OpenCV提供了豐富的鼠標(biāo)交互功能,包括但不限于:
- 獲取鼠標(biāo)的坐標(biāo)位置
- 監(jiān)聽(tīng)鼠標(biāo)點(diǎn)擊事件
- 監(jiān)聽(tīng)鼠標(biāo)滾輪事件
1.2 鼠標(biāo)事件類(lèi)型(event類(lèi)型)
在OpenCV中,通過(guò)設(shè)置鼠標(biāo)回調(diào)函數(shù),我們可以處理各種鼠標(biāo)事件。
以下是一些常見(jiàn)的鼠標(biāo)事件類(lèi)型:
- EVENT_LBUTTONDBLCLK(左鍵雙擊) = 7
- EVENT_LBUTTONDOWN(左鍵按下) = 1
- EVENT_LBUTTONUP(左鍵釋放) = 4
- EVENT_MBUTTONDBLCLK(中鍵雙擊) = 9
- EVENT_MBUTTONDOWN(中鍵按下) = 3
- EVENT_MBUTTONUP(中鍵釋放) = 6
- EVENT_MOUSEHWHEEL(鼠標(biāo)橫向滾輪滾動(dòng)) = 11
- EVENT_MOUSEMOVE(鼠標(biāo)移動(dòng)) = 0
- EVENT_MOUSEWHEEL(鼠標(biāo)滾輪滾動(dòng)) = 10
- EVENT_RBUTTONDBLCLK(右鍵雙擊) = 8
- EVENT_RBUTTONDOWN(右鍵按下) = 2
- EVENT_RBUTTONUP(右鍵釋放) = 5
1.3 鼠標(biāo)事件標(biāo)志(flags)
以下是一些常見(jiàn)的鼠標(biāo)事件標(biāo)志:
- EVENT_FLAG_ALTKEY(Alt鍵按下) = 32
- EVENT_FLAG_CTRLKEY(Ctrl鍵按下) = 8
- EVENT_FLAG_LBUTTON(左鍵按下) = 1
- EVENT_FLAG_MBUTTON(中鍵按下) = 4
- EVENT_FLAG_RBUTTON(右鍵按下) = 2
- EVENT_FLAG_SHIFTKEY(Shift鍵按下) = 16
通過(guò)設(shè)置鼠標(biāo)回調(diào)函數(shù),我們可以根據(jù)這些事件類(lèi)型和標(biāo)志來(lái)執(zhí)行相應(yīng)的操作。例如,在左鍵點(diǎn)擊時(shí)執(zhí)行某些操作,在鼠標(biāo)移動(dòng)時(shí)顯示坐標(biāo)信息,或者通過(guò)滾輪事件來(lái)放大或縮小圖像。這為圖像處理和計(jì)算機(jī)視覺(jué)應(yīng)用提供了靈活的交互性。
1.4 代碼示例
讓我們看一個(gè)簡(jiǎn)單的例子,如何通過(guò)OpenCV獲取鼠標(biāo)的坐標(biāo)位置:
import cv2
def resize_image(factor):
global image
height, width = image.shape[:2]
new_height = int(height * factor)
new_width = int(width * factor)
image = cv2.resize(image, (new_width, new_height))
cv2.imshow("Image", image)
def mouse_callback(event, x, y, flags, param):
global image
if event == cv2.EVENT_LBUTTONDOWN:
print(f"左鍵點(diǎn)擊坐標(biāo):({x}, {y})")
elif event == cv2.EVENT_RBUTTONDOWN:
print(f"右鍵點(diǎn)擊坐標(biāo):({x}, {y})")
elif event == cv2.EVENT_MBUTTONDOWN:
print(f"中鍵點(diǎn)擊坐標(biāo):({x}, {y})")
elif event == cv2.EVENT_MOUSEWHEEL:
delta = flags
if delta > 0: # 滾輪向上滾動(dòng),放大圖像
resize_image(1.1)
elif delta < 0: # 滾輪向下滾動(dòng),縮小圖像
resize_image(0.9)
elif event == cv2.EVENT_MOUSEMOVE:
# 在圖像左上角顯示坐標(biāo)
coord_text = f"({x}, {y})"
image_copy = cv2.putText(image.copy(), coord_text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow("Image", image_copy)
# 創(chuàng)建圖像窗口
cv2.namedWindow("Image")
# 設(shè)置鼠標(biāo)回調(diào)函數(shù)
cv2.setMouseCallback("Image", mouse_callback)
# 讀取圖像
image = cv2.imread("tulips.jpg")
# 在窗口中顯示圖像
cv2.imshow("Image", image.copy())
# 等待用戶(hù)按下任意鍵退出
cv2.waitKey(0)
# 關(guān)閉窗口
cv2.destroyAllWindows()
在上述代碼中,我們通過(guò)OpenCV實(shí)現(xiàn)了鼠標(biāo)的各種操作,并結(jié)合了圖像處理和顯示的功能,讓用戶(hù)能夠更直觀(guān)地感受到鼠標(biāo)事件的影響。
1.4.1 獲取鼠標(biāo)坐標(biāo)位置
通過(guò)設(shè)置鼠標(biāo)回調(diào)函數(shù) cv2.setMouseCallback
,我們可以監(jiān)聽(tīng)鼠標(biāo)的各種事件。在這個(gè)例子中,我們主要關(guān)注了鼠標(biāo)左鍵、右鍵、中鍵的點(diǎn)擊事件,以及鼠標(biāo)的滾輪事件。當(dāng)鼠標(biāo)左鍵、右鍵、中鍵被點(diǎn)擊時(shí),我們?cè)诳刂婆_(tái)輸出了相應(yīng)的坐標(biāo)信息。
if event == cv2.EVENT_LBUTTONDOWN:
print(f"左鍵點(diǎn)擊坐標(biāo):({x}, {y})")
elif event == cv2.EVENT_RBUTTONDOWN:
print(f"右鍵點(diǎn)擊坐標(biāo):({x}, {y})")
elif event == cv2.EVENT_MBUTTONDOWN:
print(f"中鍵點(diǎn)擊坐標(biāo):({x}, {y})")
1.4.2 監(jiān)聽(tīng)鼠標(biāo)滾輪事件
通過(guò)監(jiān)聽(tīng)鼠標(biāo)滾輪事件,我們可以實(shí)現(xiàn)圖像的放大和縮小。在這個(gè)例子中,當(dāng)鼠標(biāo)滾輪向上滾動(dòng)時(shí),圖像放大1.1倍;當(dāng)鼠標(biāo)滾輪向下滾動(dòng)時(shí),圖像縮小0.9倍。
elif event == cv2.EVENT_MOUSEWHEEL:
delta = flags
if delta > 0: # 滾輪向上滾動(dòng),放大圖像
resize_image(1.1)
elif delta < 0: # 滾輪向下滾動(dòng),縮小圖像
resize_image(0.9)
1.4.3 在圖像中顯示鼠標(biāo)坐標(biāo)
通過(guò)在圖像上繪制文本,我們?cè)趫D像左上角顯示了當(dāng)前鼠標(biāo)的坐標(biāo)位置。這使得用戶(hù)可以實(shí)時(shí)了解鼠標(biāo)相對(duì)于圖像的位置。
elif event == cv2.EVENT_MOUSEMOVE:
# 在圖像左上角顯示坐標(biāo)
coord_text = f"({x}, {y})"
image_copy = cv2.putText(image.copy(), coord_text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow("Image", image_copy)
通過(guò)這些功能的組合,我們實(shí)現(xiàn)了一個(gè)簡(jiǎn)單而有趣的OpenCV窗口交互示例,展示了鼠標(biāo)事件如何影響圖像的顯示和處理。這對(duì)于圖像處理和計(jì)算機(jī)視覺(jué)應(yīng)用中的交互性操作具有很大的實(shí)用性。
二、鍵盤(pán)操作
OpenCV不僅支持強(qiáng)大的圖像處理功能,還提供了靈活的鍵盤(pán)交互功能,使得用戶(hù)能夠通過(guò)鍵盤(pán)來(lái)控制圖像的顯示和處理。我們將簡(jiǎn)要探討waitKey
的操作以及等待方法的使用。
2.1 代碼示例
在OpenCV中,我們可以通過(guò)監(jiān)聽(tīng)鍵盤(pán)按鍵事件來(lái)執(zhí)行相應(yīng)的操作。以下是一個(gè)簡(jiǎn)單的示例,演示了如何通過(guò)鍵盤(pán)按下事件來(lái)實(shí)現(xiàn)圖像的放大和縮?。?/p>
import cv2
def resize_image(factor):
global image
height, width = image.shape[:2]
new_height = int(height * factor)
new_width = int(width * factor)
image = cv2.resize(image, (new_width, new_height))
cv2.imshow("Image", image)
# 讀取圖像
image = cv2.imread("tulips.jpg")
# 創(chuàng)建圖像窗口
cv2.namedWindow("Image")
cv2.imshow("Image", image)
while True:
key = cv2.waitKey(0)
if key == ord('q'): # 按下 'q' 鍵退出循環(huán)
break
elif key == ord('+'): # 按下 '+' 鍵放大圖像
resize_image(1.1)
elif key == ord('-'): # 按下 '-' 鍵縮小圖像
resize_image(0.9)
# 關(guān)閉窗口
cv2.destroyAllWindows()
在這個(gè)例子中,我們通過(guò)cv2.waitKey(0)
監(jiān)聽(tīng)鍵盤(pán)按鍵事件,ord
函數(shù)將字符轉(zhuǎn)換為對(duì)應(yīng)的ASCII碼。按下 ‘q’ 鍵退出循環(huán),按下 ‘+’ 鍵放大圖像,按下 ‘-’ 鍵縮小圖像。這樣,用戶(hù)可以通過(guò)簡(jiǎn)單的鍵盤(pán)操作來(lái)改變圖像的大小。注:輸入 'q' 時(shí),需要在英文輸入法的情況下按下。
2.2 waitKey的等待方法
cv2.waitKey
方法不僅用于檢測(cè)按鍵事件,還可以設(shè)置一個(gè)參數(shù),表示等待時(shí)間(毫秒)。
# 等待1秒
cv2.waitKey(1000)
# 關(guān)閉窗口
cv2.destroyAllWindows()
通過(guò)這些簡(jiǎn)單而實(shí)用的鍵盤(pán)交互技巧,我們可以更靈活地控制OpenCV中圖像的顯示和處理,使得圖像處理過(guò)程更加交互化。
三、添加窗口控件
在OpenCV中,通過(guò)添加窗口控件,我們可以實(shí)現(xiàn)更豐富的圖形用戶(hù)界面(GUI),使用戶(hù)能夠通過(guò)滑動(dòng)條、按鈕等控件與圖像進(jìn)行交互。這里將以滑動(dòng)條為例,詳細(xì)描述如何在OpenCV窗口中添加控件。
3.1 滑動(dòng)條(Trackbar)的基本使用
滑動(dòng)條是OpenCV中最常用的窗口控件之一,可以用于調(diào)整參數(shù),比如圖像的亮度、對(duì)比度等。以下是一個(gè)簡(jiǎn)單的例子,演示如何在OpenCV窗口中添加滑動(dòng)條:
import cv2
def on_trackbar_change(value):
# 當(dāng)滑動(dòng)條數(shù)值改變時(shí)調(diào)用的回調(diào)函數(shù)
print(f"滑動(dòng)條數(shù)值:{value}")
# 創(chuàng)建一個(gè)圖像窗口
cv2.namedWindow("Image")
# 創(chuàng)建一個(gè)滑動(dòng)條,并指定其所屬的窗口、滑動(dòng)條的名稱(chēng)、最小值、最大值、回調(diào)函數(shù)
cv2.createTrackbar("Trackbar", "Image", 50, 100, on_trackbar_change)
while True:
# 等待用戶(hù)按下任意鍵退出循環(huán)
key = cv2.waitKey(1)
if key != -1:
break
# 關(guān)閉窗口
cv2.destroyAllWindows()
在這個(gè)例子中,我們通過(guò)cv2.createTrackbar
創(chuàng)建了一個(gè)名為 “Trackbar” 的滑動(dòng)條,它隸屬于名為 “Image” 的窗口,初始值為50,最小值為0,最大值為100。每次滑動(dòng)條數(shù)值發(fā)生改變時(shí),都會(huì)調(diào)用 on_trackbar_change
這個(gè)回調(diào)函數(shù)。
3.2 自定義滑動(dòng)條回調(diào)函數(shù)
我們可以根據(jù)實(shí)際需求,自定義滑動(dòng)條數(shù)值發(fā)生變化時(shí)的回調(diào)函數(shù)。例如,在滑動(dòng)條變化時(shí)實(shí)時(shí)調(diào)整圖像的亮度、對(duì)比度等參數(shù),或者觸發(fā)其他特定的操作。
import cv2
def on_channel_change(value):
global image
# 獲取各個(gè)滑動(dòng)條的值
brightness = cv2.getTrackbarPos("Brightness", "Image") - 50
red = max(cv2.getTrackbarPos("Red", "Image") - 100, 0)
green = max(cv2.getTrackbarPos("Green", "Image") - 100, 0)
blue = max(cv2.getTrackbarPos("Blue", "Image") - 100, 0)
# 調(diào)整圖像的亮度和RGB通道
adjusted_image = cv2.addWeighted(image, 1, image, 0, brightness)
adjusted_image[:, :, 2] += red
adjusted_image[:, :, 1] += green
adjusted_image[:, :, 0] += blue
# 顯示調(diào)整后的圖像
cv2.imshow("Image", adjusted_image)
# 創(chuàng)建圖像窗口
cv2.namedWindow("Image")
# 創(chuàng)建滑動(dòng)條,并指定窗口、滑動(dòng)條名稱(chēng)、初始值、最大值、回調(diào)函數(shù)
cv2.createTrackbar("Brightness", "Image", 50, 100, on_channel_change)
cv2.createTrackbar("Red", "Image", 100, 200, on_channel_change)
cv2.createTrackbar("Green", "Image", 100, 200, on_channel_change)
cv2.createTrackbar("Blue", "Image", 100, 200, on_channel_change)
# 讀取圖像
image = cv2.imread("tulips.jpg")
# 在窗口中顯示圖像
cv2.imshow("Image", image)
# 等待用戶(hù)按下任意鍵退出
cv2.waitKey(0)
# 關(guān)閉窗口
cv2.destroyAllWindows()
在這個(gè)例子中,on_channel_change
函數(shù)會(huì)在滑動(dòng)條數(shù)值發(fā)生變化時(shí)被調(diào)用,根據(jù)數(shù)值的變化調(diào)整圖像的亮度和顏色,并實(shí)時(shí)在窗口中顯示調(diào)整后的圖像。
通過(guò)這些示例,可以更好地理解如何在OpenCV中添加滑動(dòng)條及其回調(diào)函數(shù),從而實(shí)現(xiàn)圖像處理中的交互操作。這提供了一種靈活的方式,使用戶(hù)能夠通過(guò)控件與圖像進(jìn)行動(dòng)態(tài)交互。
四、實(shí)現(xiàn)鼠標(biāo)跟隨繪制方框的交互效果
在圖像處理中,有時(shí)候需要手動(dòng)標(biāo)注或選擇感興趣區(qū)域。通過(guò)結(jié)合鼠標(biāo)事件和按鍵處理,我們可以實(shí)現(xiàn)鼠標(biāo)跟隨繪制方框的交互效果。下面通過(guò)一個(gè)簡(jiǎn)單的例子詳細(xì)介紹如何在OpenCV中實(shí)現(xiàn)這一功能。
4.1 代碼實(shí)現(xiàn)
下面是一個(gè)簡(jiǎn)單的例子,通過(guò)OpenCV實(shí)現(xiàn)鼠標(biāo)跟隨繪制方框的功能。代碼中還包含了撤銷(xiāo)上一個(gè)框線(xiàn)的操作。
import cv2
drawing = False
start_point = (-1, -1)
rectangles = [] # 存儲(chǔ)繪制的框線(xiàn)信息的列表
def mouse_callback(event, x, y, flags, param):
global drawing, start_point
# 檢測(cè)Ctrl鍵狀態(tài)
ctrl_pressed = flags & cv2.EVENT_FLAG_CTRLKEY == cv2.EVENT_FLAG_CTRLKEY
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
start_point = (x, y)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if ctrl_pressed:
# 如果按下Ctrl鍵,畫(huà)藍(lán)色的框線(xiàn)
cv2.rectangle(image, start_point, (x, y), (255, 0, 0), 2)
rectangles.append(((start_point[0], start_point[1]), (x, y), (255, 0, 0)))
else:
# 否則,畫(huà)綠色的框線(xiàn)
cv2.rectangle(image, start_point, (x, y), (0, 255, 0), 2)
rectangles.append(((start_point[0], start_point[1]), (x, y), (0, 255, 0)))
cv2.imshow("Image", image)
elif event == cv2.EVENT_MOUSEMOVE:
# 清空?qǐng)D像
image_temp = image.copy()
# 灰色橫線(xiàn)
cv2.line(image_temp, (x, 0), (x, image.shape[0]), (127, 127, 127), 1, cv2.LINE_AA)
# 灰色豎線(xiàn)
cv2.line(image_temp, (0, y), (image.shape[1], y), (127, 127, 127), 1, cv2.LINE_AA)
if drawing:
# 根據(jù)Ctrl鍵狀態(tài)畫(huà)藍(lán)色或綠色的框線(xiàn)
if ctrl_pressed:
cv2.rectangle(image_temp, start_point, (x, y), (255, 0, 0), 2)
else:
cv2.rectangle(image_temp, start_point, (x, y), (0, 255, 0), 2)
cv2.imshow("Image", image_temp)
def undo_last_rectangle():
global rectangles, image
if rectangles:
# 撤銷(xiāo)上一個(gè)框線(xiàn)
rectangles.pop()
# 清空?qǐng)D像
image = cv2.imread("tulips.jpg")
# 重新繪制之前的所有框線(xiàn)
for rect_info in rectangles:
cv2.rectangle(image, rect_info[0], rect_info[1], rect_info[2], 2)
cv2.imshow("Image", image)
# 創(chuàng)建圖像窗口
cv2.namedWindow("Image")
# 設(shè)置鼠標(biāo)回調(diào)函數(shù)
cv2.setMouseCallback("Image", mouse_callback)
# 讀取圖像
image = cv2.imread("tulips.jpg")
# 在窗口中顯示圖像
cv2.imshow("Image", image)
while True:
key = cv2.waitKey(0)
if key == 27: # 退出鍵
break
elif key == ord('z') or key == ord('Z'): # 按下Z鍵
undo_last_rectangle()
# 關(guān)閉窗口
cv2.destroyAllWindows()
4.2 代碼解析
-
鼠標(biāo)事件處理:
mouse_callback
函數(shù)處理鼠標(biāo)事件,包括鼠標(biāo)按下、抬起和移動(dòng)事件。在按下左鍵時(shí),標(biāo)記開(kāi)始繪制;抬起左鍵時(shí),停止繪制,并根據(jù)Ctrl鍵狀態(tài)選擇畫(huà)綠色或藍(lán)色框線(xiàn);在移動(dòng)過(guò)程中,顯示灰色的輔助線(xiàn)。 -
撤銷(xiāo)操作:
undo_last_rectangle
函數(shù)用于撤銷(xiāo)上一個(gè)繪制的框線(xiàn)。它會(huì)清空?qǐng)D像并重新繪制之前所有的框線(xiàn)。 -
主循環(huán): 主循環(huán)監(jiān)聽(tīng)鍵盤(pán)按鍵事件,按下 “Z” 鍵時(shí)執(zhí)行撤銷(xiāo)操作,按下 “ESC” 鍵時(shí)退出循環(huán)。
4.3 運(yùn)行代碼
在彈出的圖像窗口中,可以通過(guò)鼠標(biāo)繪制綠色或藍(lán)色的框線(xiàn),按下 “Z” 鍵撤銷(xiāo)上一個(gè)框線(xiàn),按下 “ESC” 鍵退出程序。
這個(gè)例子演示了如何結(jié)合鼠標(biāo)事件和鍵盤(pán)事件,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的交互式圖像標(biāo)注工具。我們可以根據(jù)實(shí)際需求擴(kuò)展這個(gè)例子,添加更多的交互功能。
五、自由調(diào)節(jié)窗口圖像的尺寸
在圖像處理和計(jì)算機(jī)視覺(jué)應(yīng)用中,有時(shí)候需要對(duì)圖像窗口進(jìn)行自由調(diào)節(jié),以便更好地查看細(xì)節(jié)或全局圖像。通過(guò)監(jiān)聽(tīng)鼠標(biāo)事件,我們可以實(shí)現(xiàn)自由調(diào)節(jié)窗口圖像尺寸的效果。以下是一個(gè)使用OpenCV的簡(jiǎn)單例子,演示了如何通過(guò)鼠標(biāo)事件實(shí)現(xiàn)窗口圖像尺寸的自由調(diào)節(jié)。
5.1 代碼實(shí)現(xiàn)
import cv2
resizing = False
window_name = "Image"
def mouse_callback(event, x, y, flags, param):
global resizing
if event == cv2.EVENT_LBUTTONDOWN:
resizing = True
elif event == cv2.EVENT_LBUTTONUP:
resizing = False
elif event == cv2.EVENT_MOUSEMOVE:
if resizing:
# 獲取窗口的位置和大小
rect = cv2.getWindowImageRect(window_name)
win_x, win_y, win_width, win_height = rect
# 判斷鼠標(biāo)是否在窗口的邊緣
if win_x < x < win_x + win_width and win_y < y < win_y + win_height:
cv2.resizeWindow(window_name, x - win_x, y - win_y)
# 創(chuàng)建圖像窗口
cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)
# 設(shè)置鼠標(biāo)回調(diào)函數(shù)
cv2.setMouseCallback(window_name, mouse_callback)
# 讀取圖像
image = cv2.imread("tulips.jpg")
# 在窗口中顯示圖像
cv2.imshow(window_name, image)
# 設(shè)置窗口的初始大小為圖像的大小
cv2.resizeWindow(window_name, image.shape[1], image.shape[0])
# 等待用戶(hù)按下任意鍵退出
cv2.waitKey(0)
# 關(guān)閉窗口
cv2.destroyAllWindows()
5.2 代碼解釋
-
鼠標(biāo)事件處理:
mouse_callback
函數(shù)用于處理鼠標(biāo)事件,包括按下左鍵、抬起左鍵和鼠標(biāo)移動(dòng)。當(dāng)鼠標(biāo)按下左鍵時(shí),設(shè)置resizing
為 True;當(dāng)抬起左鍵時(shí),設(shè)置resizing
為 False。在鼠標(biāo)移動(dòng)過(guò)程中,如果resizing
為 True,則獲取窗口的位置和大小,并根據(jù)鼠標(biāo)位置調(diào)整窗口大小。 -
創(chuàng)建圖像窗口: 使用
cv2.namedWindow
創(chuàng)建一個(gè)圖像窗口,并指定窗口名為 “Image”,設(shè)置窗口標(biāo)志為cv2.WINDOW_NORMAL
,這樣窗口大小可以被調(diào)整。 -
設(shè)置鼠標(biāo)回調(diào)函數(shù): 使用
cv2.setMouseCallback
設(shè)置鼠標(biāo)回調(diào)函數(shù),即上述的mouse_callback
函數(shù)。 -
顯示圖像和設(shè)置初始窗口大?。?/strong> 讀取圖像,使用
cv2.imshow
在窗口中顯示圖像,并通過(guò)cv2.resizeWindow
設(shè)置窗口的初始大小為圖像的大小。
5.3 運(yùn)行代碼
在彈出的圖像窗口中,我們可以通過(guò)按下左鍵并拖動(dòng)鼠標(biāo)自由調(diào)節(jié)窗口的大小。這種交互式的窗口調(diào)節(jié)方式對(duì)于查看大尺寸圖像或處理細(xì)節(jié)較多的圖像非常有用。
六、中文顯示亂碼問(wèn)題
在圖像處理中,有時(shí)候我們需要在圖像上顯示中文字符。為了在OpenCV中實(shí)現(xiàn)中文顯示,我們需要確保系統(tǒng)的字體支持中文。
6.1 實(shí)現(xiàn)步驟
- 創(chuàng)建一個(gè)空白圖像
首先,我們創(chuàng)建一個(gè)空白圖像,以便后續(xù)在圖像上添加中文字符。
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
# 創(chuàng)建一個(gè)空白圖像
height, width, _ = 300, 500, 3
image = np.ones((height, width, 3), np.uint8) * 255
- 設(shè)置中文字體
選擇一個(gè)支持中文的字體,這里以宋體為例。我們需要替換font_path
變量為本地系統(tǒng)中的字體文件路徑,確保字體文件支持中文。
如果沒(méi)有字體文件,還需要自行下載字體文件。
# 設(shè)置中文字體
font_path = r"C:\Windows\Fonts\simsun.ttc" # 替換為本地的字體文件路徑
font_size = 30
font = ImageFont.truetype(font_path, font_size)
- 在圖像上添加中文字符
使用PIL
庫(kù)來(lái)在圖像上添加中文字符。在這個(gè)例子中,我們添加了一個(gè)簡(jiǎn)單的中文字符 “你好,OpenCV!”。
# 在圖像上添加中文字符
image_pil = Image.fromarray(image)
draw = ImageDraw.Draw(image_pil)
text = "你好,OpenCV!"
text_position = (50, 150)
text_color = (0, 0, 0) # 黑色
draw.text(text_position, text, font=font, fill=text_color)
- 轉(zhuǎn)換回OpenCV圖像格式并顯示
將PIL
圖像格式轉(zhuǎn)換回OpenCV格式,并通過(guò)OpenCV顯示圖像。
# 轉(zhuǎn)換回OpenCV圖像格式
image = np.array(image_pil)
# 顯示圖像
cv2.imshow("Chinese Text", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
6.2 代碼實(shí)現(xiàn)
以下是一個(gè)簡(jiǎn)單的例子,演示了如何在OpenCV中顯示中文字符。
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
# 創(chuàng)建一個(gè)空白圖像
height, width, _ = 300, 500, 3
image = np.ones((height, width, 3), np.uint8) * 255
# 設(shè)置中文字體
font_path = r"C:\Windows\Fonts\simsun.ttc" # 替換為本地的字體文件路徑
font_size = 30
font = ImageFont.truetype(font_path, font_size)
# 在圖像上添加中文字符
image_pil = Image.fromarray(image)
draw = ImageDraw.Draw(image_pil)
text = "你好,OpenCV!"
text_position = (50, 150)
text_color = (0, 0, 0) # 黑色
draw.text(text_position, text, font=font, fill=text_color)
# 轉(zhuǎn)換回OpenCV圖像格式
image = np.array(image_pil)
# 顯示圖像
cv2.imshow("Chinese Text", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-759130.html
總結(jié)
通過(guò)這篇文章,我們快速入門(mén)了OpenCV的窗口交互功能。從鼠標(biāo)和鍵盤(pán)操作到窗口控件的添加,我們探索了多種交互方式,并通過(guò)實(shí)例演示了如何實(shí)現(xiàn)調(diào)整圖像亮度和顏色、鼠標(biāo)跟隨繪制綠色框、自由調(diào)節(jié)窗口圖像尺寸以及中文顯示。
希望這些簡(jiǎn)單而實(shí)用的示例能夠更好地理解和運(yùn)用OpenCV的窗口交互功能。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-759130.html
到了這里,關(guān)于OpenCV快速入門(mén):窗口交互的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!