Transformación-traducción afín de OpenCV

Transformación-traducción afín de OpenCV

Fórmula y principio

Defina las coordenadas originales como (x, y) y las coordenadas después de la traslación (efecto x, desplazamiento y) como (x * , y * ):
Inserte la descripción de la imagen aquí
es decir, el valor de píxel original en la posición (x, y) se traduce a (x ' , y ' ), con el fin de facilitar las operaciones de la computadora, se puede escribir en estilo matricial:

Inserte la descripción de la imagen aquí
La matriz de transformación anti-fuego M en OpenCV es:
Inserte la descripción de la imagen aquí

Función OpenCV

Obtenga la matriz de transformación a través de la función cv :: getAffineTransform
cv :: Mat getAffineTransform (cv :: InputArray src, cv :: InputArray dst)
Input
InputArray src: tres puntos de entrada
InputArray dstL: tres puntos de salida
return
cv :: El objeto Mat
se traduce o gira cv :: Objeto Mat a través de cv :: warpAffine
void warpAffine (InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR, int borderMode = BORDER_CONSTANT, const Scalar & borderValue = Scalar ()) ;
src : Imagen de origen.
** dst **: Imagen de destino que tiene el tamaño dsize y el mismo tipo que src.
M -: matriz de transformación 2 \ times 3.
dsize : Tamaño de la imagen de destino.
flags: Combinación de métodos de interpolación (ver resize ()) y el indicador opcional WARP_INVERSE_MAP que significa que M es la transformación inversa (\ texttt {dst} \ rightarrow \ texttt {src}).
borderMode : método de extrapolación de píxeles (consulte borderInterpolate ()). Cuando borderMode = BORDER_TRANSPARENT, significa que los píxeles de la imagen de destino correspondientes a los "valores atípicos" en la imagen de origen no son modificados por la función.
borderValue: valor utilizado en caso de un borde constante. Por defecto, es 0.
无 返回 值

Código de implementación

#include<iostream>
#include<opencv2/core.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>

int main() {
	cv::Mat src = cv::imread("D:\\Windows\\WorkSpace\\imageTest\\OIP.jpg",cv::IMREAD_COLOR);
	if (src.empty()) {
		std::cout << "failed to read image." << std::endl;
		return EXIT_FAILURE;
	}

	cv::Point2f pt1[3], pt2[3];
	float xoffset = src.cols / 5;
	float yoffset = src.rows / 3;

	/*平移前的位置*/
	pt1[0] = cv::Point2f(0, 0);//            0  0
	pt1[1] = cv::Point2f(xoffset, 0);//      x  0
	pt1[2] = cv::Point2f(0, yoffset);//      0  y
	/*平移后的位置*/
	pt2[0] = cv::Point2f(xoffset, yoffset);//         x  y
	pt2[1] = cv::Point2f(xoffset * 2, yoffset);//    2x  y
	pt2[2] = cv::Point2f(xoffset, yoffset * 2);//     x  2y

	//生成只有平移的防射矩阵
	cv::Mat M;
	M = cv::getAffineTransform(pt1, pt2);

	std::cout << M << std:: endl;

	int col = src.cols;
	int row = src.rows;

	//std::cout << src.size() << std::endl;

	//生成新的显示结果的矩阵(图)
	cv::Mat dst = cv::Mat::zeros(col + xoffset, row + yoffset, CV_32FC1);
	//std::cout << dst.size() << std::endl;
	//平移
	cv::warpAffine(src, dst, M, dst.size());
	
	cv::namedWindow("平移前", cv::WINDOW_AUTOSIZE);
	cv::imshow("平移前", src);
	cv::namedWindow("平移后", cv::WINDOW_AUTOSIZE);
	cv::imshow("平移后", dst);
	cv::waitKey(0);
}

Efecto de ejecución de código

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/southfor/article/details/109393028
Recomendado
Clasificación