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 * ):
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:
La matriz de transformación anti-fuego M en OpenCV es:
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);
}