python 实现拖拽验类型证码的图片定位
使用庫
import cv2
import numpy as np
加載圖片
img = cv2.imread(‘img/1.jpg’)
僅保留高光的顏色
lower = np.array([210, 210, 210])
upper = np.array([255, 255, 255])
thresh = cv2.inRange(img, lower, upper)
修改lower 或者upper 可以調(diào)整保留的顏色 目前保留的是白色的滑塊邊框
圖片二值化
ret, binary = cv2.threshold(thresh, 127, 255, cv2.THRESH_BINARY)
膨脹圖片
k = cv2.getStructuringElement(cv2.MORPH_RECT,(20, 20))
binary = cv2.dilate(binary,k)
腐蝕圖片
k2 = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5))
binary = cv2.erode(binary, k2)
查找輪廓
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_TC89_KCOS)
輪廓信息添加到area 列表
area = [] for k in range(len(contours)):# if len((contours[k])) < 111111 and cv2.contourArea(contours[k])<20000 :# print(cv2.contourArea(contours[k]))area.append((cv2.contourArea(contours[k]),k))列表排序打印最大邊緣
num_ary = area i = 0 while i < len(num_ary) - 1:i += 1n = 0while n < len(num_ary) - 1:if num_ary[n] > num_ary[n + 1]:num_ary[n], num_ary[n + 1] = num_ary[n + 1], num_ary[n]n += 1 print(num_ary) print("最大邊緣:",(num_ary[-1])[0])發(fā)現(xiàn)被包含的邊緣且邊緣的面積等于給定范圍
滑塊碰撞和腐蝕后白邊會增大因此可以確定滑塊中一定會存在另外一個內(nèi)邊緣
i[0] 是邊緣的面積,邊緣的面積在給頂范圍之內(nèi)
計算滑塊的中間點
M = cv2.moments(contours[max_idx]) center_x = int(M["m10"] / M["m00"]) center_y = int(M["m01"] / M["m00"]) print("x軸位置:",center_x)
最后返回中心點離開x軸起點距離
源碼:
import cv2 import numpy as npimg = cv2.imread('img/1.jpg') lower = np.array([210, 210, 210]) upper = np.array([255, 255, 255]) thresh = cv2.inRange(img, lower, upper) ret, binary = cv2.threshold(thresh, 127, 255, cv2.THRESH_BINARY) k = cv2.getStructuringElement(cv2.MORPH_RECT,(20, 20)) binary = cv2.dilate(binary,k) cv2.imshow("img", binary) cv2.waitKey(0) k2 = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5)) binary = cv2.erode(binary, k2) cv2.imshow("img", binary) cv2.waitKey(0) contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_TC89_KCOS) area = [] # 找到最大的輪廓 for k in range(len(contours)):# if len((contours[k])) < 111111 and cv2.contourArea(contours[k])<20000 :# print(cv2.contourArea(contours[k]))area.append((cv2.contourArea(contours[k]),k)) print(area) # 列表排序 num_ary = area i = 0 while i < len(num_ary) - 1:i += 1n = 0while n < len(num_ary) - 1:if num_ary[n] > num_ary[n + 1]:num_ary[n], num_ary[n + 1] = num_ary[n + 1], num_ary[n]n += 1 print(num_ary) print("最大邊緣:",(num_ary[-1])[0]) # 最適合內(nèi)邊緣 max_idx = 0 cv2.drawContours(img, contours, -1, (0, 0, 255), 2) time_mun = 0 while time_mun < 10:up_n = (num_ary[-1-time_mun])[1]for i in area:if 4000 > i[0] > 2000:print('符合條件的輪廓:',i[1])for j in contours[i[1]]:x = int((j[0])[0])y = int((j[0])[1])dist = Nonedist = cv2.pointPolygonTest(contours[up_n], (x, y), True)if dist>0:max_idx = i[1]time_mun = 11breaktime_mun = time_mun+1print("最可能是滑塊的是:",max_idx) print("邊角數(shù):",len(contours[max_idx])) M = cv2.moments(contours[max_idx]) # 計算第一條輪廓的各階矩,字典形式 center_x = int(M["m10"] / M["m00"]) center_y = int(M["m01"] / M["m00"]) print("X軸位置:",center_x) cv2.circle(img, (center_x, center_y), 60, (0, 0, 255), 2) cv2.imshow("img", img) cv2.waitKey(0)總結
以上是生活随笔為你收集整理的python 实现拖拽验类型证码的图片定位的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 清北毕业生2019就业去向:北大从政人数
- 下一篇: 哈希之开散列,闭散列