亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

OpenCV中邊緣檢測的示例分析

發布時間:2021-06-11 14:43:19 來源:億速云 閱讀:124 作者:小新 欄目:開發技術

這篇文章主要介紹OpenCV中邊緣檢測的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

邊緣在人類視覺和計算機視覺中均起著重要的作用。

人類能夠僅憑一張背景剪影或一個草圖就識別出物體類型和姿態。

其中OpenCV提供了許多邊緣檢測濾波函數,這些濾波函數都會將非邊緣區域轉為黑色,將邊緣區域轉為白色或其他飽和的顏色。

不過這些濾波函數都很容易將噪聲錯誤地識別為邊緣,所以需要進行模糊處理。

本次的模糊操作使用高斯模糊(低通濾波器),最常用的模糊濾波器(平滑濾波器)之一,是一個削弱高頻信號強度的低通濾波器。

低通濾波器,在像素與周圍像素的亮度差值小于一個特定值時,平滑該像素的亮度,主要用于去噪和模糊化。

邊緣檢測則是使用OpenCV的Canny函數實現,算法雖然很復雜,但是代碼卻很簡單。

5個步驟,使用高斯濾波器對圖像去噪、計算梯度、在邊緣上使用非最大抑制(NMS)、在檢測到的邊緣上使用雙(double)閾值去除陽性(false positive)、分析所有的邊緣及其連接,保留真正的邊緣并消除不明顯的邊緣。

下面就來實現一下「跳一跳」的邊緣檢測,得以獲取方塊的中心位置。

/ 01 / 邊緣檢測

Canny邊緣檢測代碼如下。

import cv2
import numpy as np
# 讀取原圖像
img = cv2.imread('game.png', 0)
# 顯示原圖像
cv2.namedWindow('img', 0)
cv2.resizeWindow('img', 400, 600)
cv2.imshow('img', img)
# 高斯模糊
img_rgb = cv2.GaussianBlur(img, (5, 5), 0)
canny_img = cv2.Canny(img_rgb, 1, 10)
# 顯示邊緣檢測圖像
cv2.namedWindow('canny', 0)
cv2.resizeWindow('canny', 400, 600)
cv2.imshow('canny', canny_img)
# 輸出邊緣檢測圖像的高和寬
H, W = canny_img.shape
print(H, W)

輸出的圖像高寬分別為1920和1080。

下面是原圖像灰度圖和邊緣檢測圖像。

OpenCV中邊緣檢測的示例分析

接下來,通過邊緣檢測圖像找到方塊的第一個頂點(上頂點)。

# 第一個頂點的高度,row為列表(代表每一行的像素值),max(row)獲取列表中最大的像素值
y_top = np.nonzero([max(row) for row in canny_img[400:]])[0][0] + 400

對圖像高度大于400的行進行遍歷(這樣可以去除上方數字270以及小程序塊的影響)。

np.nonzero()表示獲取列表元素數值不為0的位置,第一個即為上頂點的高度值。

OpenCV中邊緣檢測的示例分析

接下來獲取上頂點的寬度值。

# 第一個頂點的寬度
x_top = int(np.mean(np.nonzero(canny_img[y_top])))

這里發現有好幾個水平點,所以最后取平均值。

接下來對方塊下頂點的位置進行確定。

OpenCV中邊緣檢測的示例分析

為了跳過小白圈的影響,在上頂點高度的基礎上加上80個像素大小。

然后往下方遍歷,寬度值保持不變,直至找到像素值不為0的點。

便得到了方塊的下頂點坐標。

# 跳過小白圈,然后遍歷
y_bottom = y_top + 80
for row in range(y_bottom, H):
  if canny_img[row, x_top] != 0:
    y_bottom = row
    break
# 得到方塊的中心點
x_center, y_center = x_top, (y_top + y_bottom) // 2
# 繪制以方塊中心點為圓心的圓
cv2.circle(canny_img, (x_center, y_center), 33, (255, 0, 255), 2)
# 顯示得到的圖像
cv2.namedWindow('result', 0)
cv2.resizeWindow('result', 400, 600)
cv2.imshow('result', canny_img)
# 結束
cv2.waitKey(0)
cv2.destroyAllWindows()

最后通過上下頂點的坐標,得到方塊的中心點。

OpenCV中邊緣檢測的示例分析

左圖為邊緣檢測原圖,右圖為找到方塊中心點并以中心點為圓心繪制圓形的圖像。

/ 02 / 跳動實現

現在結合之前模板匹配獲得到的小跳棋位置,計算兩中心的距離。

勾三股四弦五,便能得到兩個中心的距離了。

看下圖,一目了然。

OpenCV中邊緣檢測的示例分析

玩過跳一跳的應該都知道,對于不同的距離,我們需要按壓的時間是不同的。

所以可以給距離和按壓時間設置一個相關參數,此處設置為1.35。

對于我的手機簡直完美匹配(與屏幕大小有關)。

最后通過adb命令完成一定的按壓時間,完成「跳一跳」自動化。

以上是“OpenCV中邊緣檢測的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

克什克腾旗| 巴中市| 漾濞| 清水县| 太白县| 轮台县| 金坛市| 望奎县| 玉田县| 青铜峡市| 陆河县| 仙居县| 柘荣县| 和硕县| 麻阳| 肃北| 盐山县| 常德市| 化德县| 武汉市| 远安县| 莲花县| 绥棱县| 淮北市| 安泽县| 任丘市| 斗六市| 夹江县| 茌平县| 柳河县| 浪卡子县| 浑源县| 镇巴县| 汶上县| 虹口区| 历史| 抚州市| 刚察县| 勃利县| 江北区| 青海省|