es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Estimación de la matriz rotacional y translacional para el movimiento de la cámara en OpenCV.

Estoy tratando de implementar un algoritmo para estimar el movimiento dado dos imágenes. He utilizado el algoritmo SIFT para detectar características.

sift = cv2.xfeatures2d.SIFT<em>create()
kp, des = sift.detectAndCompute(image</em>gray,None)

También utilicé el emparejamiento de fuerza bruta para emparejar las características de las imágenes.

bf = cv2.BFMatcher()
match = bf.knnMatch(des1,des2, k=2)
bestmatch = []
for m,n in match:
    if m.distance < 0.4*n.distance:
        bestmatch.append([m])

Por lo tanto, intenté estimar el movimiento de la cámara resolviendo la matriz de rotación y el vector de translación usando findessentialmatrix.

rmat = np.eye(3)
tvec = np.zeros((3, 1))
image1<em>points = []
image2</em>points = []

for ma in bestmatch:
    ma=ma[0]
    queryidx = mi.queryIdx
    trainidx = mi.trainIdx

    x1, y1 = kp1[queryidx].pt
    image1_points.append([x1, y1])

    x2, y2 = kp2[trainidx].pt
    image2_points.append([x2, y2])

E,mask=cv2.findEssentialMat(np.array(image1<em>points),np.array(image2</em>points),dataset_handler.k,method=cv2.RANSAC, prob=0.999, threshold=0.5)

retval,R,t,mask=cv2.recoverPose(E,np.array(image1<em>points),np.array(image2</em>points),dataset_handler.k)

romat = R
transvec = t

El resultado no fue bueno. A continuación se muestra un ejemplo de cómo se veía mi resultado, así como el vector de translación y la matriz de rotación.

Rotación estimada: es una matriz 3×3 con valores que no llegan a 1, incluyendo valores negativos.

Translación estimada: vectores 3 x 1 con valores que no llegan a 1 y también con un valor negativo.

La imagen resultante es la siguiente:

Result after motion estimation

Las imágenes también fueron emparejadas de esta manera:

Matched features

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como experto en informática especializado en Python, C ++, OpenCV y visión por computadora, sugiero probar algunas cosas para mejorar el algoritmo de estimación de movimiento:

    1. Prueba utilizar un detector de características diferente además de SIFT. SIFT está patentado y no está disponible en las últimas versiones de OpenCV. Puedes probar utilizando ORB, SURF o AKAZE, que están disponibles y son similares a SIFT.

    2. Utiliza un método diferente para emparejar características entre imágenes. Como tu método actual es un emparejador de fuerza bruta, podría ser lento y poco preciso. Intenta utilizando un emparejador FLANN, que es más rápido y preciso.

    3. El valor de umbral en cv2.findEssentialMat podría ser demasiado alto. Intenta disminuirlo para ver si mejora el resultado.

    4. Si los pasos anteriores no funcionan, intenta utilizar un método diferente para estimar el movimiento de la cámara, como cv2.solvePnPRansac. Este método utiliza un algoritmo de estimación más robusto y podría dar mejores resultados.

    5. Además, prueba evaluando la precisión de tu algoritmo de estimación de movimiento mediante la comparación de la pose de cámara estimada con la verdad fundamental. Si el error es significativo, es posible que debas ajustar el algoritmo o los parámetros de entrada.

Comments are closed.