Detección de puntos característicos de Harris | Estudio del equipo de junio de Datawhale (tarea1)

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

1. Principio

1.1 Oficial

Función de respuesta de esquina:
Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquí
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:
Inserte la descripción de la imagen aquí
Imagen de efecto:
Inserte la descripción de la imagen aquí

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:
Inserte la descripción de la imagen aquí
Imagen de efecto:
Inserte la descripción de la imagen aquí

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.
Inserte la descripción de la imagen aquí

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)        


Supongo que te gusta

Origin blog.csdn.net/weixin_42326479/article/details/106933629
Recomendado
Clasificación