Utilicé las características de ubicación de los cuatro puntos de esquina para encontrar los puntos de esquina. Para obtener más información, consulte: Método de transformación de perspectiva para corregir contornos (proceso completo) | código de Python
Utilice esquinas de Harris para detectar las cuatro esquinas del rectángulo de salida
1. Principio
1.1 Oficial
Función de respuesta de esquina:
Por lo tanto: establezca un umbral, y los píxeles con puntuaciones superiores a este umbral corresponden a las esquinas.
1.2 Configuración de parámetros
dst = cv2.cornerHarris (src, blockSize, ksize, k [, dst [, borderType]])
blockSize — calcula el tamaño de la matriz en el momento
Ksize — tamaño de la ventana
k — representa el tamaño del parámetro al calcular la respuesta del ángulo, el valor predeterminado es 0.04-0.06 Between
Threshold t-usado para filtrar la respuesta angular
2. Realización inicial
2.1 Pantalla de efectos
Imagen original:
Imagen de efecto:
2.2 Visualización de código
import cv2
from matplotlib import pyplot as plt
import numpy as np
img = cv2.imread('D:/python_opencv/H_1.jpg')
cv2.namedWindow("img",cv2.cv2.WINDOW_FREERATIO)
cv2.imshow("img",img)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
h,w = img.shape[0],img.shape[1]
#Harris角点检测
gray_img = np.float32(gray_img)
corners_img = cv2.cornerHarris(gray_img,blockSize=2, ksize=3, k=0.04)
cv2.imshow("corners_img",corners_img)
#膨胀
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))
dst = cv2.dilate(corners_img, kernel)
cv2.imshow("dst",dst)
#阈值设定
img[dst > 0.005*dst.max()] = [225, 0, 0]
cv2.namedWindow("Harris",cv2.cv2.WINDOW_FREERATIO)
cv2.imshow('Harris', img)
count = 0
print(h,w)
#左上角
for i in range(h//2):
for j in range(w//2):
if img[i][j][0] == 225:
cv2.circle(img,(j,i),5,(0,255,255),0)
count += 1
#右上角
for i in range(h//2):
for j in range(w//2,w):
if img[i][j][0] == 225:
cv2.circle(img,(j,i),5,(0,255,255),0)
count += 1
#左下角
for i in range(h//2,h):
for j in range(w//2):
if img[i][j][0] == 225:
cv2.circle(img,(j,i),5,(0,255,255),0)
count += 1
#右下角
for i in range(h//2,h):
for j in range(w//2,w):
if img[i][j][0] == 225:
cv2.circle(img,(j,i),5,(0,255,255),0)
count += 1
print(count)
cv2.namedWindow("final",cv2.cv2.WINDOW_FREERATIO)
cv2.imshow('final', img)
cv2.waitKey(0)
3. Plan de mejora
Requisitos: solo mantenga 4 puntos de esquina
3.1 Visualización de efectos
Imagen original:
Imagen de efecto:
3.2 Explicación del principio
El método de almacenamiento de cada esquina es en el sentido de las agujas del reloj, como se muestra en la figura siguiente. Por lo tanto, las imágenes superior izquierda y superior derecha se obtienen durante el primer ciclo, la imagen inferior izquierda debe ciclarse hasta el final y la imagen inferior derecha debe perfeccionarse y no se discutirá por el momento.
3.3 Visualización de código
import cv2
from matplotlib import pyplot as plt
import numpy as np
img = cv2.imread('D:/python_opencv/H_1.jpg')
src = img.copy()
cv2.namedWindow("img",cv2.cv2.WINDOW_FREERATIO)
cv2.imshow("img",img)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray_img, (7, 7), 0)
h,w = img.shape[0],img.shape[1]
#Harris角点检测
gray_img = np.float32(gray)
corners_img = cv2.cornerHarris(gray_img,blockSize=2, ksize=3, k=0.04)
cv2.imshow("corners_img",corners_img)
#膨胀
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))
dst = cv2.dilate(corners_img, kernel)
cv2.imshow("dst",dst)
#阈值设定
img[dst > 0.005*dst.max()] = [225, 0, 0]
cv2.namedWindow("Harris",cv2.cv2.WINDOW_FREERATIO)
cv2.imshow('Harris', img)
count = 0
print(h,w)
upLeftX = 0
upLeftY = 0
downLeftX = 0
downLeftY = 0
upRightX = 0
upRightY = 0
downRightX = 0
downRightY = 0
#左上角
for i in range(h//2):
for j in range(w//2):
if img[i][j][0] == 225:
cv2.circle(img,(j,i),5,(0,255,255),-1)
count += 1
if upLeftX == 0 and upLeftY == 0 :
upLeftX = i
upLeftY = j
break
if upLeftX or upLeftY:
break
#右上角
for i in range(h//2):
for j in range(w//2,w):
if img[i][j][0] == 225:
cv2.circle(img,(j,i),5,(0,255,255),-1)
count += 1
if upRightX == 0 and upRightY == 0:
upRightX = i
upRightY = j
break
if upRightX or upRightY:
break
#左下角
for i in range(h//2,h):
for j in range(w//2):
if img[i][j][0] == 225:
cv2.circle(img,(j,i),5,(0,255,255),-1)
count += 1
downLeftX = i
downLeftY = j
#右下角
for i in range(h//2,h):
for j in range(w//2,w):
if img[i][j][0] == 225:
cv2.circle(img,(j,i),5,(0,255,255),-1)
count += 1
downRightX = i
downRightY = j
cv2.line(img, (0,h//2), (w,h//2), (0,0,255))
cv2.line(img, (w//2,0), (w//2,h), (0,0,255))
cv2.namedWindow("all_Harris",cv2.cv2.WINDOW_FREERATIO)
cv2.imshow('all_Harris', img)
cv2.circle(src,(upLeftY,upLeftX),5,(0,255,255),-1)
cv2.circle(src,(upRightY,upRightX),5,(0,255,255),-1)
cv2.circle(src,(downLeftY,downLeftX),5,(0,255,255),-1)
cv2.circle(src,(downRightY,downRightX),5,(0,255,255),-1)
print(count)
cv2.namedWindow("final",cv2.cv2.WINDOW_FREERATIO)
cv2.imshow('final', src)
cv2.waitKey(0)