Definición y aplicación de la matriz de homografía.

1. Introducción a la matriz de homografía.

Durante el método de calibración de Zhang Zhengyou, la matriz de homografía se puede utilizar para calcular la relación de transformación entre el plano de la placa de calibración y el plano de píxeles, que a su vez contiene los parámetros internos de la cámara y la matriz de parámetros extrínsecos de la placa de calibración y la cámara. En geometría proyectiva, la matriz de homografía se utiliza más para representar la relación de transformación entre dos planos . Para calibración

s \begin{bmatrix} u\\v\\1\end{bmatrix}=A\begin{bmatrix} R&t\end{bmatrix} \begin{bmatrix} X_W\\Y_W\\Z_W\\1\end{bmatrix }

Sea el punto mundial Z_W=0y coopere la parte media con M, entonces tenemos

s \begin{bmatrix} u\\v\\1\end{bmatrix}=M\begin{bmatrix} X_W\\Y_W\\1\end{bmatrix}

Si hay dos cámaras diferentes, o la misma cámara se envía al mismo plano en diferentes posiciones, entonces hay

\begin{bmatrix} u_2\\v_2\\1\end{bmatrix}=M_2\begin{bmatrix} X_W\\Y_W\\1\end{bmatrix}=M_2M_1^{-1}\begin{bmatrix} u_1\ \v_1\\1\end{bmatrix}=H\begin{bmatrix} u_1\\v_1\\1\end{bmatrix}

Esto muestra que existe un conjunto de relaciones que pueden realizar la transformación mutua de dos planos de píxeles, y el cálculo y la calibración específicos son similares.

Debido al 1 en la última fila, la matriz H todavía solo tiene 8 grados de libertad , por lo que solo se necesitan cuatro conjuntos de puntos correspondientes para calcularla.

2. El papel de la matriz de homografía en la visión por computadora.

1. Corrección de imagen

Esto se puede lograr utilizando cuatro conjuntos de puntos correspondientes.

2. Cambio de perspectiva

 Convierta la vista normal a vista de pájaro fácilmente

https://img-blog.csdnimg.cn/20181229155213634

3. Unión de imágenes

Debido a que la matriz de homografía puede realizar la conversión de perspectiva, las imágenes tomadas desde diferentes ángulos se pueden convertir a la misma perspectiva, logrando así el empalme de imágenes.

 https://img-blog.csdnimg.cn/20181229155213680

 https://img-blog.csdnimg.cn/20181229155213726

4. Realidad Aumentada (AR)

Los patrones de marcadores planos bidimensionales se utilizan a menudo para pantallas AR. Según las imágenes desde diferentes ángulos de visión del marcador, la posición y postura del objeto virtual se pueden obtener y mostrar fácilmente. 

https://img-blog.csdnimg.cn/20181229155213765

 3. Solución de matriz de homografía

\begin{bmatrix} u_2\\v_2\\1\end{bmatrix}=H\begin{bmatrix} u_1\\v_1\\1\end{bmatrix}=\begin{bmatrix} h_1&h_2&h_3\\h_4&h_5&h_6\\h_7&h_8&h_9\ fin{bmatrix}\begin{bmatrix} u_1\\v_1\\1\end{bmatrix}

hacerh_9=1 

u_2=\frac{h_1u_1+h_2u_2+h_3}{h_7u_1+h_8v_1+1}

v_2=\frac{h_4u_1+h_5u_2+h_6}{h_7u_1+h_8v_1+1}

Organizado y disponible

u_2(h_7u_1+h_8v_1+1)=h_1u_1+h_2u_2+h_3

v_2(h_7u_1+h_8v_1+1)=h_4u_1+h_5u_2+h_6

Organizar en forma matricial

\begin{bmatrix} u_1&u_2&1&0&0&0&-u_1u_2&-v_1u_2\\0&0&0&u_1&u_2&1&-u_1v_2&-v_1v_2 \end{} \begin{bmatrix}h_1\\h_2\\h_3\\h_4\\h_5\\h_6\\h_7\\h_8 \ final {bmatrix}=\begin{bmatrix}u_2\\v_2\end{}

Entonces sólo se necesitan cuatro conjuntos de puntos para resolver la matriz de homografía.

Sin embargo, en la práctica, los pares de puntos clave que calculamos contendrán ruido e incluso discrepancias, por lo que usar solo 4 conjuntos de puntos para calcular la matriz de homografía provocará un gran error. Por lo tanto, generalmente se utilizan más de cuatro conjuntos de puntos para los cálculos. Además, es difícil obtener la solución óptima mediante el método directo, por lo que en la práctica se utilizan otros métodos de optimización para la solución, como SVD, LM y otros algoritmos.

Hay funciones listas para usar en opencv que se pueden llamar

Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() )

Desde el punto de vista de la función, solo necesita ingresar los puntos coincidentes correspondientes y especificar el método de cálculo específico para generar el resultado.

4. Ejemplo de código de unión de imágenes

Entrada: dos imágenes

​​​​​​

 Salida: empalme la imagen 2 con la imagen 1

 Código: virtual_billboard.cpp

#include <opencv/cv.h>
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <vector>
#include <iostream>

class ImageMosic{
public:
    ImageMosic(cv::Mat img_src,cv::Mat img_target){
        img_src_ = img_src.clone();
        img_target_ = img_target.clone();
        SetSrcPts();
        SetTargetPts();
        CalcHAndPerspective();
    }

private:
    struct UserData{
        cv::Mat img;
        std::vector<cv::Point2f> pts;
    };
    void SetSrcPts()
    {
        cv::Size src_size = img_src_.size();
        src_pts_.push_back(cv::Point2f(0, 0));
        src_pts_.push_back(cv::Point2f(src_size.width-1, 0));
        src_pts_.push_back(cv::Point2f(src_size.width-1, src_size.height-1));
        src_pts_.push_back(cv::Point2f(0, src_size.height-1));
    }

    static void mouseHandler(int event, int x, int y, int flags,void* data_ptr)
    {
        if (event ==cv::EVENT_LBUTTONDOWN)
        {
            UserData *data = (UserData *)data_ptr;
            cv::circle( data->img, cv::Point(x, y), 3, cv::Scalar(0, 255, 255), 5);
            cv::imshow("Image_target", data->img);
            if (data->pts.size() < 4)
            {
                data->pts.push_back(cv::Point2f(x,y));
            }
        }
    }

    void SetTargetPts(){
        //show the image
        cv::imshow("Image_target", img_target_);
        std::cout << "Click on four corners of a billboard and then press ENTER" << std::endl;
        //set the callback function for any mouse event
        UserData user_data;
        user_data.img = img_target_;
        cv::setMouseCallback("Image_target", mouseHandler, &user_data);
        cv::waitKey(0);
        target_pts_ = user_data.pts;
    }
    void CalcHAndPerspective(){
        assert(target_pts_.size() == 4);
        cv::Mat H = cv::findHomography(src_pts_, target_pts_, 0);                   //计算单应矩阵
        cv::warpPerspective(img_src_, img_src_perspective_, H, img_target_.size()); //透视变换
        cv::Point pts_dst[4] = {target_pts_[0], target_pts_[1], target_pts_[2], target_pts_[3]};
        cv::fillConvexPoly(img_target_, pts_dst, 4, cv::Scalar(0));
        img_target_ = img_target_ + img_src_perspective_;

        cv::imshow("Image_target", img_target_);
        cv::waitKey(0);
    }
private:
    cv::Mat img_src_;
    cv::Mat img_src_perspective_;
    cv::Mat img_target_;
    std::vector<cv::Point2f> src_pts_;
    std::vector<cv::Point2f> target_pts_;
};

int main(){
    cv::Mat img_src = cv::imread("../images/cvlife.jpg");
    cv::Mat img_target = cv::imread("../images/ad.jpg");
    ImageMosic img_mosaic(img_src, img_target);
   
    return 0;
}

 CMakelists.txt

cmake_minimum_required(VERSION 1.0)
project(virtual_billboard)

find_package(OpenCV)

add_executable(virtual-billboard src/virtual_billboard.cpp)
target_link_libraries(virtual-billboard ${OpenCV_LIBS})

 Pasos de operación: seleccione 4 puntos en el sentido de las agujas del reloj desde la esquina superior izquierda de la imagen y presione Enter para finalizar

 resultado:

5. Recuperación de rotación y traducción.

        De manera similar a la matriz esencial, la matriz de homografía debe descomponerse para obtener la matriz de rotación y traslación. Los métodos de descomposición incluyen métodos numéricos [2][3] y métodos analíticos [4]. Similar a la matriz esencial, la descomposición de la matriz de homografía también devolverá 4 conjuntos de matrices de rotación y traslación y, al mismo tiempo, se pueden calcular los vectores normales de los planos donde se encuentran sus correspondientes puntos de escena. Si se sabe que los puntos del mapa fotografiados tienen profundidades positivas (es decir, frente a la cámara), entonces ambos grupos pueden eliminarse. Al final quedan dos soluciones que requieren más información previa para poder emitir un juicio. Por lo general, podemos resolverlo asumiendo que se conoce el vector normal del plano de la escena. Si el plano de la escena es paralelo al plano de la cámara, entonces el valor teórico del vector normal es \textbf{1}^T.

        La homografía es de gran importancia en SLAM. Cuando los puntos característicos son coplanares o la cámara sufre una rotación pura, el grado de libertad de la matriz básica disminuye y se produce degradación. En realidad, los datos siempre contendrán algo de ruido. Si continuamos utilizando el método de ocho puntos para resolver la matriz básica, los grados de libertad adicionales estarán determinados principalmente por el ruido. Para evitar el impacto de los fenómenos de degradación, generalmente estimamos la matriz básica F y la matriz de homografía H al mismo tiempo, y seleccionamos la que tiene menor error de reproyección como matriz de estimación de movimiento final.

6.Referencia

[1] Comprensión y resolución de la matriz de homografía_Blog-CSDN Blog_Homography Matrix de Machine Vision 001

[2]Faugeras OD, Lustman F. Movimiento y estructura a partir del movimiento en un entorno plano por partes [J]. Revista internacional de reconocimiento de patrones e inteligencia artificial, 1988, 2(03): 485-508.

[3] Zhang Z, Hanson A R. Reconstrucción 3D basada en mapeo de homografía [J]. Proc. ARPA96, 1996: 1007-1012.

[4]Malis E, Vargas M. Comprensión más profunda de la descomposición de la homografía para el control basado en la visión [D]. INRIA, 2007.

Supongo que te gusta

Origin blog.csdn.net/qq_38650944/article/details/124568257
Recomendado
Clasificación