OpenCV affine Transformation-Übersetzung
OpenCV affine Transformation-Übersetzung
Formel und Prinzip
Definieren Sie die ursprünglichen Koordinaten als (x, y) und die Koordinaten nach der Übersetzung (xoffect, yoffset) als (x * , y * ).
Das heißt, der ursprüngliche Pixelwert an der Position (x, y) wird in (x) übersetzt Die Position ' , y ' ) kann zur Erleichterung des Computerbetriebs im Matrixstil geschrieben werden:
Die Anti-Feuer-Transformationsmatrix M in OpenCV lautet:
OpenCV-Funktion
Rufen Sie die Transformationsmatrix über die Funktion
cv :: getAffineTransform ab. Cv :: Mat getAffineTransform (cv :: InputArray src, cv :: InputArray dst)
Eingabe
InputArray src: drei Punkte der Eingabe
InputArray dstL: drei Punkte der Ausgabe
return
cv :: Das Mat-Objekt
wird durch cv :: warpAffine übersetzt oder gedreht. Cv :: Mat-Objekt
void warpAffine (InputArray src, OutputArray dst, InputArray M, Größe dsize, int flags = INTER_LINEAR, int borderMode = BORDER_CONSTANT, const Scalar & borderValue = Scalar ()) ;
src :
Quellbild . ** dst **: Zielbild mit der Größe dsize und dem gleichen Typ wie src.
M -: 2 \ mal 3-Transformationsmatrix.
dsize : Größe des Zielbilds .
Flags: Kombination von Interpolationsmethoden (siehe resize ()) und dem optionalen Flag WARP_INVERSE_MAP, was bedeutet, dass M die inverse Transformation ist (\ texttt {dst} \ rightarrow \ texttt {src}).
borderMode : Pixelextrapolationsmethode (siehe borderInterpolate ()). Wenn borderMode = BORDER_TRANSPARENT ist, bedeutet dies, dass die Pixel im Zielbild, die den „Ausreißern“ im Quellbild entsprechen, von der Funktion nicht geändert werden.
borderValue - Wert, der bei einem konstanten Rand verwendet wird. Standardmäßig ist es 0.
无 返回 值
Implementierungscode
#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);
}