文章目錄
- 一、實驗目的
- 二、實驗內容
- 三、實驗過程
- OpenCV-python的安裝與配置
- python下載和環境配置
- PIP鏡像
- 安裝Numpy
- 安裝openCV-python
- 檢驗opencv安裝是否成功
- openCV-python的基本操作
- 圖像輸入和展示以及寫出
- openCV界面編程
- 單窗口顯示多圖片
- 鼠標事件
- 鍵盤事件
- 滑動條事件
- 四、實驗結果
- 五、實驗總結
一、實驗目的
本實驗目的是學習如何使用opencv庫來讀取文件并顯示圖象,學習opencv中的基本事件——窗口事件,鼠標事件、鍵盤事件以及滑動條事件,同時熟悉OpenCV庫的函數和方法,為進一步學習和應用計算機視覺和圖像處理提供基礎。
二、實驗內容
1、opencv的安裝
2、opencv的基本操作 - 圖像輸入輸出模塊:通過cv2.imread()函數讀取圖像文件,并使用cv2.imshow()函數顯示圖像。使用cv2.waitKey()等待按鍵響應,然后使用cv2.destroyAllWindows()關閉窗口。使用shape屬性獲取圖像的形狀(高度、寬度)。使用cv2.imwrite()函數將圖像保存到指定的文件中。 - opencv界面編程:界面編程主要由High-level GUI模塊支持。 - 單窗口顯示多圖片:使用hstack函數實現單窗口顯示多幅圖像。 - 銷毀窗口:使用destroyWindow和destroyAllWindows來銷毀窗口,前者為銷毀某一個制定名稱的窗口,后者為銷毀所有的窗口。 - 鼠標事件:我們使用鼠標事件來實現與用戶的交互操作,有鼠標點擊事件、鼠標移動事件、鼠標釋放事件等。 - 鍵盤事件:鍵盤事件由waitKey函數實現。 - 滑動條事件:使用cv2.createTrackbar()函數創建一個滑動條,并指定滑動條的名稱、所屬窗口、數值范圍和初始值等參數。定義一個滑動條事件的回調函數,并將其與窗口綁定。在滑動條事件回調函數中,根據滑動條的數值變化對圖像進行實時更新和顯示。
三、實驗過程
OpenCV-python的安裝與配置
python下載和環境配置
1.前往python官網進行對應版本的下載
2.下載完成打開程序進行配置,點擊Install Now 也可以進行安裝目錄的更改
3.檢測安裝成果,打開命令行窗口,輸入pyhthon
如果顯示如下圖就安裝配置成功
PIP鏡像
再命令行窗口分別運行以下兩行代碼,如下圖
第一行是更新pip
第二行是把pip對應的國外網站改為鏡像國內的,提高下載速度 python -m pip install --upgrade pip pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
安裝Numpy
打開命令行輸入 pip install numpy
來下載Numpy包,如圖(不更改pip鏡像會很慢)
安裝openCV-python
命令行運行 pip install opencv-python
如圖
再安裝一下openCV的擴展包,后面接版本號,和我們安裝openCV版本一致即可 pip install opencv-contrib-python4.8.0.76
再安裝一個可視化庫 pip install matplotlib
檢驗opencv安裝是否成功
命令行先輸入python
然后導入一下包 import cv2
再檢查一下版本 cv2.version
如果能正常顯示版本就是安裝成功,然后exit()退出即可
openCV-python的基本操作
圖像輸入和展示以及寫出
# 讀取圖像文件src_image = cv2.imread('bird.jpg', cv2.IMREAD_COLOR)gray_image = cv2.imread('bird.jpg', cv2.IMREAD_GRAYSCALE)cv2.imshow("src_image", src_image)print(src_image.shape)cv2.waitKey(0)# 寫入圖像文件cv2.imwrite('gray_image.jpg', gray_image)
效果展示
圖像寫入和展示
灰度圖像的寫入
openCV界面編程
OpenCV界面編程 img = cv2.imread('image.jpg') cv2.imshow("mying", img) cv2.waitKey(0)
效果展示
對應圖片會出現在以mying命名的窗口中
單窗口顯示多圖片
# 單窗口顯示多圖片def opencv_muti_pic():img1 = cv2.imread('1.jpg')print(img1.shape)img2 = cv2.imread('1.jpg')print(img2.shape)img3 = cv2.imread('1.jpg')print(img3.shape)imgs = np.hstack([img1, img2, img3])# 展示多個cv2.imshow('mutil_pic', imgs)# 等待關閉cv2.waitKey(0)opencv_muti_pic()
效果展示
鼠標事件
鼠標事件 # 回調函數,用于處理鼠標事件 def mouse_callback(event, x, y, flags, param): if event == cv2.EVENT_MOUSEMOVE: # 鼠標移動事件 print('Mouse moved at (%d, %d)' % (x, y)) elif event == cv2.EVENT_LBUTTONDOWN: # 鼠標左鍵按下事件 print('Left button down at (%d, %d)' % (x, y)) elif event == cv2.EVENT_RBUTTONDOWN: # 鼠標右鍵按下事件 print('Right button down at (%d, %d)' % (x, y)) elif event == cv2.EVENT_MBUTTONDOWN: # 鼠標中鍵按下事件print('Middle button down at (%d, %d)' % (x, y)) elif event == cv2.EVENT_LBUTTONUP: # 鼠標左鍵釋放事件 print('Left button up at (%d, %d)' % (x, y)) elif event == cv2.EVENT_RBUTTONUP: # 鼠標右鍵釋放事件 print('Right button up at (%d, %d)' % (x, y)) elif event == cv2.EVENT_MBUTTONUP: # 鼠標中鍵釋放事件 print('Middle button up at (%d, %d)' % (x, y))elif event == cv2.EVENT_LBUTTONDBLCLK: # 鼠標左鍵雙擊事件 print('Left button double-clicked at (%d, %d)' % (x, y)) elif event == cv2.EVENT_RBUTTONDBLCLK: # 鼠標右鍵雙擊事件 print('Right button double-clicked at (%d, %d)' % (x, y)) elif event == cv2.EVENT_MBUTTONDBLCLK: # 鼠標中鍵雙擊事件 print('Middle button double-clicked at (%d, %d)' % (x, y))# 創建一個名為 "image" 的窗口cv2.namedWindow('image')# 讀取圖像img = cv2.imread('image.jpg')# 在窗口中顯示圖像cv2.imshow('image', src_image)# 設置鼠標回調函數cv2.setMouseCallback('image', mouse_callback)cv2.waitKey(0)# 關閉窗口cv2.destroyAllWindows()
效果展示
對應輸出結果會隨鼠標指針在圖像上的位置而變化
鍵盤事件
# 鍵盤事件 img7 = numpy.zeros((100, 200)) cv2.imshow("windowname", img7 key1 = cv2.waitKey(0) # 任意按鍵按下,圖片顯示結束,返回按鍵鍵值 print("按下的鍵值:", key1) cv2.imshow("windowname2", img7) key2 = cv2.waitKey(5000) # 任意按鍵按下,圖片顯示結束,返回按鍵鍵值 print("按下的鍵值:", key2) cv2.destroyAllWindows()
效果展示
鍵盤事件
輸入q的情況,會返回對應的q的ASCII碼值
第二個窗口長期不按會顯示-1的返回結果
滑動條事件
滑動條事件# 回調函數,用于處理滑動條變化事件def TrackbarCallback(value):print('Trackbar value is: %d' % value)# 創建一個名為 "image" 的窗口cv2.namedWindow('image')# 讀取圖像img = cv2.imread('image.jpg')# 在窗口中顯示圖像cv2.imshow('image', img)# 創建一個名為 "slider" 的滑動條cv2.createTrackbar('slider', 'image', 0, 100, TrackbarCallback)# 獲取滑動條的當前值slider_value = cv2.getTrackbarPos('slider', 'image')print('Initial slider value: %d' % slider_value)# 設置滑動條的值cv2.setTrackbarPos('slider', 'image', 50)# 循環等待鍵盤輸入while True:key = cv2.waitKey(10)if key == ord('q'):break# 關閉窗口cv2.destroyAllWindows()
效果展示
通過鼠標滑動圖片上方的滑動條可以再控制臺動態的輸出滑動條信息
四、實驗結果
實驗結果已經在實驗過程中寫出,實驗結果的所有截圖均可在實驗過程中查看,這里不做過多展示
五、實驗總結
通過本次實驗,我對以下知識有了更好的掌握:文件讀取和圖像顯示:學習如何使用OpenCV庫來讀取圖像文件并在窗口中顯示圖像,這是圖像處理的基礎操作。窗口事件:了解如何處理窗口事件,比如窗口的關閉事件,以確保圖像顯示過程中的交互性和穩定性。鼠標事件:學習如何捕獲和處理鼠標事件,比如點擊、移動和拖拽等,為圖像標記、交互式測量等功能的實現奠定基礎。鍵盤事件:掌握如何處理鍵盤事件,比如按鍵響應和組合操作,為實現鍵盤控制的圖像處理流程打下基礎。滑動條事件:了解如何創建和使用滑動條,實現圖像處理參數的實時調整和交互式控制。為進一步學習和應用計算機視覺和圖像處理奠定基礎。