• Empleos
  • Sobre nosotros
  • profesionales
    • Inicio
    • Empleos
    • Cursos y retos
    • Preguntas
    • Profesores
  • empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Pruebas Online
    • Nómina
    • Blog
    • Comercial
    • Calculadora de salario

0

223
Vistas
Detección de ángulo de rotación de objetos circulares

Estoy tratando de detectar la diferencia de ángulo entre dos objetos circulares, que se muestran como 2 imágenes a continuación.

Estoy pensando en rotar una de las imágenes con un ángulo pequeño. Cada vez que se gira una imagen, se calculará el SSIM entre la imagen girada y la otra imagen. El ángulo con SSIM máximo será la diferencia de ángulo.

Pero, encontrar los extremos nunca es un problema fácil. Entonces mi pregunta es: ¿Hay otros algoritmos (opencv) que se puedan usar en este caso?

IMAGEN #1 imagen maestra

IMAGEN #2 ingrese la descripción de la imagen aquí

EDITAR:

Gracias @Micka, simplemente hago lo mismo que él sugiere y elimino la región negra como dijo @Yves Daoust para mejorar el tiempo de procesamiento. Aquí está mi resultado final:

IMAGEN ORIGINALimagen 1 IMAGEN GIRATORIA + DESPLAZADAimagen 2

about 3 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Aquí está la misma idea, pero la correlación se realiza con una convolución (FFT) en lugar de matchTemplate . Las FFT pueden ser más rápidas si hay muchos datos.

Cargar entradas:

 im1 = cv.imread("circle1.jpg", cv.IMREAD_GRAYSCALE) im2 = cv.imread("circle2.jpg", cv.IMREAD_GRAYSCALE) height, width = im1.shape

Transformación polar (log polar como ejercicio para el lector) con algunos parámetros arbitrarios que afectan la "resolución":

 maxradius = width // 2 stripwidth = maxradius stripheight = int(maxradius * 2 * pi) # approximately square at the radius #stripheight = 360 def polar(im): return cv.warpPolar(im, center=(width/2, height/2), dsize=(stripwidth, stripheight), maxRadius=maxradius, flags=cv.WARP_POLAR_LOG*0 + cv.INTER_LINEAR) strip1 = polar(im1) strip2 = polar(im2)

Circunvolución:

 f1 = np.fft.fft2(strip1[::-1, ::-1]) f2 = np.fft.fft2(strip2) conv = np.fft.ifft2(f1 * f2)

minmaxloc:

 conv = np.real(conv) # or np.abs, can't decide (i,j) = np.unravel_index(conv.argmax(), conv.shape) i,j = (i+1) % stripheight, (j+1) % stripwidth

y qué es eso como un ángulo:

 print("degrees:", i / stripheight * 360) # 42.401091405184175

https://gist.github.com/crackwitz/3da91f43324b0c53504d587a394d4c71

about 3 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recomiéndame algunas ofertas
Necesito ayuda