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 * ).
Fügen Sie hier eine Bildbeschreibung ein
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:

Fügen Sie hier eine Bildbeschreibung ein
Die Anti-Feuer-Transformationsmatrix M in OpenCV lautet:
Fügen Sie hier eine Bildbeschreibung ein

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);
}

Code-Ausführungseffekt

Fügen Sie hier eine Bildbeschreibung ein

Ich denke du magst

Origin blog.csdn.net/southfor/article/details/109393028
Empfohlen
Rangfolge