最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

OpenCV學習筆記 | ROI區(qū)域選擇提取 | Python

2023-06-28 16:18 作者:余暉匆匆  | 我要投稿

摘要

? ? ? ? ROI區(qū)域是指圖像中我們感興趣的特定區(qū)域,OpenCV提供了一些函數(shù)來選擇和提取ROI區(qū)域,我們可以使用OpenCV的鼠標事件綁定函數(shù),然后通過鼠標操作在圖像上繪制一個矩形框,該矩形框即為ROI區(qū)域。本文將介紹代碼的實現(xiàn)以及四個主要函數(shù)CV2.setMouseCallback、def select_roi(event, x, y, flags, param)、CV2.namedWindow、CV2.rectangle。

原始圖像貓貓素材


一、主要函數(shù)簡介? ? ? ??

????????CV2.setMouseCallback 是OpenCV中的一個函數(shù),用于設置鼠標事件的回調函數(shù)。回調函數(shù)是一種被作為參數(shù)傳遞給其他函數(shù)的函數(shù),用于在特定事件發(fā)生或條件滿足時被調用。函數(shù)原型為:CV2.setMouseCallback(windowName, onMouse[, param])?。其中,windowName?表示窗口的名稱,可以是創(chuàng)建窗口時指定的名稱;onMouse表示回調函數(shù),用于處理鼠標事件;param?表示可選參數(shù),傳遞給回調函數(shù)的額外參數(shù)。這里不設置額外參數(shù)。

????????def select_roi(event, x, y, flags, param)?為定義的回調函數(shù)。其中,event?表示事件的類型,可以是鼠標的按下、釋放、移動等事件;x?和?y?分別表示鼠標的x坐標和y坐標;flags?表示鼠標事件的標志,用于指示是單擊、雙擊以及按下的是哪個按鈕;param?表示回調函數(shù)的額外參數(shù)。這里不設置額外參數(shù)。

????????CV2.namedWindow?用于創(chuàng)建一個顯示窗口,創(chuàng)建后可以使用其他OpenCV的函數(shù)在窗口中顯示圖像或繪圖。函數(shù)原型為:CV2.namedWindow(winname[, flags])?。其中,winname?表示窗口名稱,是一個字符串。每個窗口在OpenCV中都必須有一個唯一的名稱;flags?表示可選參數(shù),用于指定窗口的顯示方式,可以是以下標志的組合:

????????CV2.WINDOW_NORMAL:窗口大小可調整。

????????CV2.WINDOW_AUTOSIZE:窗口大小自適應圖像大小。

????????CV2.rectangle?是OpenCV中用于在圖像上繪制矩形的函數(shù)。

????????函數(shù)原型為:CV2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])?。其中,img?表示要繪制矩形的圖像;pt1?表示矩形的頂點坐標(左上角);pt2?表示矩形的頂點坐標(右下角);color?表示矩形的顏色,可以是BGR值的元組或整數(shù);thickness?表示矩形邊框的線寬,默認為1;lineType?表示線條的類型,默認為8連接線;shift?表示坐標點表示中的小數(shù)位數(shù),默認為0。這里不設置線條類型,只設置線條寬度。

二、代碼內容講解

????????首先,我們定義了一個名為?select_roi?的回調函數(shù),用于處理鼠標事件。在鼠標左鍵按下時,它記錄了矩形框的左上角坐標。在鼠標左鍵釋放時,它記錄了矩形框的右下角坐標。然后,它使用CV2.rectangle?函數(shù)在圖像上繪制出選擇的矩形框。drawing, top_left_pt, bottom_right_pt?都是用于處理鼠標事件的變量,用來記錄鼠標交互的狀態(tài)和位置信息。我們把回調函數(shù)傳給CV2.setMouseCallback ,讓它在?CV2.namedWindow?定義的窗口上進行操作。

def select_roi(event, x, y, flags, param):

? ? global drawing, top_left_pt, bottom_right_pt # 在函數(shù)內部使用這些變量時,引用或修改已經存在于全局作用域中的變量。


? ? if event == CV2.EVENT_LBUTTONDOWN: # 如果鼠標事件為左鍵按下

? ? ? ? drawing = True # 繪圖狀態(tài)開始

? ? ? ? top_left_pt = (x, y) # 將按下的坐標賦值


? ? elif event == CV2.EVENT_LBUTTONUP: # 如果鼠標事件為左鍵釋放

? ? ? ? drawing = False # 繪圖狀態(tài)結束

? ? ? ? bottom_right_pt = (x, y) # 將抬起的坐標賦值


? ? ? ? CV2.rectangle(image, top_left_pt, bottom_right_pt, (0, 0, 255), 2) # 用紅色,線寬為2的線繪圖


drawing = False #用于記錄是否正在繪制矩形的狀態(tài),初始為Flase

top_left_pt, bottom_right_pt = (-1, -1), (-1, -1) # 矩形的左上角頂點坐標和矩形的右下角頂點坐標初始化


CV2.namedWindow('ROI Selection') # 創(chuàng)建一個窗口

CV2.setMouseCallback('ROI Selection', select_roi) # 在創(chuàng)建的窗口中傳入回調函數(shù)

?????在主循環(huán)中,我們顯示了圖像,并通過CV2.waitKey來檢測按鍵輸入。按下’a’鍵時,程序退出循環(huán),即通過使用選擇的頂點坐標來提取ROI區(qū)域,并顯示在一個名為’ROI’的新窗口中。在這里,通過索引圖像的像素來提取ROI區(qū)域。

????????CV2.waitKey(1)會暫停程序執(zhí)行,等待用戶按下鍵盤上的一個按鍵。函數(shù)會返回用戶按下的鍵的ASCII碼值(整數(shù)類型),如果在等待期間沒有按鍵按下,返回值為-1。

while True:

? ? CV2.imshow('ROI Selection', image)

? ? if CV2.waitKey(1) == 27:? # 按下ESC鍵退出,執(zhí)行下面的提取代碼

? ? ? ? break


# 提取ROI區(qū)域

print("矩形左上角橫坐標:",top_left_pt[0])

print("矩形左上角縱坐標:",top_left_pt[1])

print("矩形右下角橫坐標:",bottom_right_pt[0])

print("矩形右下角縱坐標:",bottom_right_pt[1])

roi = image[top_left_pt[1]:bottom_right_pt[1], top_left_pt[0]:bottom_right_pt[0]] # 圖像切片的第一個參數(shù)是高度,第二個參數(shù)是寬度,并且圖像的最左上角坐標是(0,0)

cv_show('ROI',roi)

????需要注意的是圖像的最左上角的坐標為(0,0),切片操作的第一個參數(shù)為圖像高度,第二個參數(shù)才是圖像的寬度。

三、結果展示

可愛貓貓結果展示


OpenCV學習筆記 | ROI區(qū)域選擇提取 | Python的評論 (共 條)

分享到微博請遵守國家法律
乐平市| 亳州市| 进贤县| 仲巴县| 盐山县| 鄯善县| 湄潭县| 三亚市| 青河县| 新田县| 花垣县| 蓬莱市| 兰西县| 涿州市| 道孚县| 越西县| 武陟县| 礼泉县| 电白县| 哈尔滨市| 武清区| 北海市| 安义县| 丰县| 石嘴山市| 榆中县| 建阳市| 天祝| 扶风县| 蒙自县| 仙居县| 白银市| 兰坪| 连江县| 民乐县| 布尔津县| 奉化市| 东兴市| 阳泉市| 磐石市| 抚远县|