常见的图像变换

常见的图像变换

  • 一、仿射变换
    • 代码
    • 结果
  • 二、透视变化
    • 代码示例
    • 结果
  • 三、通用变换
    • 对数——极坐标变换示例
    • 结果


一、仿射变换

CV_EXPORTS_W void warpAffine( 
InputArray src, 
OutputArray dst,
InputArray M, 
Size dsize,
int flags = INTER_LINEAR,
int borderMode = BORDER_CONSTANT,
const Scalar& borderValue = Scalar()
);
CV_EXPORTS Mat getAffineTransform( 
const Point2f src[], 
const Point2f dst[] 
);

代码

#include 
#include 
using namespace std;
using namespace cv;


static void test() {
	string path = "lena.jpg";
	Mat src = cv::imread(path);
	if (src.empty()) {
		cout << "can not load image" << endl;
		return ;
	}
	cv::Point2f srcTri[] = {
	  cv::Point2f(0,0),           // src Top left
	  cv::Point2f(src.cols - 1, 0), // src Top right
	  cv::Point2f(0, src.rows - 1)  // src Bottom left
	};

	cv::Point2f dstTri[] = {
	  cv::Point2f(src.cols*0.f, src.rows*0.33f),   // dst Top left
	  cv::Point2f(src.cols*0.85f, src.rows*0.25f), // dst Top right
	  cv::Point2f(src.cols*0.15f, src.rows*0.7f)   // dst Bottom left
	};

	// COMPUTE AFFINE MATRIX
	//
	cv::Mat warp_mat = cv::getAffineTransform(srcTri, dstTri);
	cv::Mat dst, dst2;
	cv::warpAffine(
		src,
		dst,
		warp_mat,
		src.size(),
		cv::INTER_LINEAR,
		cv::BORDER_CONSTANT,
		cv::Scalar()
	);
	for (int i = 0; i < 3; ++i)
		cv::circle(dst, dstTri[i], 5, cv::Scalar(255, 0, 255), -1, cv::LINE_AA);

	cv::imshow("Affine Transform Test", dst);
	cv::waitKey();

	for (int frame = 0;; ++frame) {

		// COMPUTE ROTATION MATRIX
		cv::Point2f center(src.cols*0.5f, src.rows*0.5f);
		double angle = frame * 3 % 360, scale = (cos((angle - 60)* CV_PI / 180) + 1.05)*0.8;

		cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, scale);

		cv::warpAffine(
			src,
			dst,
			rot_mat,
			src.size(),
			cv::INTER_LINEAR,
			cv::BORDER_CONSTANT,
			cv::Scalar()
		);
		cv::imshow("Rotated Image", dst);
		if (cv::waitKey(30) >= 0)
			break;

	}
}

int main() 
{
	test();
	system("pause");
	return 0;
}

结果

常见的图像变换_第1张图片
常见的图像变换_第2张图片


二、透视变化

代码示例

#include 
#include 
using namespace std;
using namespace cv;

static void test() {
	string path = "Image.jpg";
	Mat src = cv::imread(path);
	if (src.empty()) {
		cout << "can not load image" << endl;
		return;
	}
	cv::Point2f srcQuad[] = {
   cv::Point2f(0, 0),                   // src Top left
   cv::Point2f(src.cols - 1, 0),          // src Top right
   cv::Point2f(src.cols - 1, src.rows - 1), // src Bottom right
   cv::Point2f(0, src.rows - 1)           // src Bottom left
	};

	cv::Point2f dstQuad[] = {
	  cv::Point2f(src.cols*0.05f, src.rows*0.33f),
	  cv::Point2f(src.cols*0.9f, src.rows*0.25f),
	  cv::Point2f(src.cols*0.8f, src.rows*0.9f),
	  cv::Point2f(src.cols*0.2f, src.rows*0.7f)
	};

	// COMPUTE PERSPECTIVE MATRIX
	//
	cv::Mat warp_mat = cv::getPerspectiveTransform(srcQuad, dstQuad);
	cv::Mat dst;
	cv::warpPerspective(src, dst, warp_mat, src.size(), cv::INTER_LINEAR,
		cv::BORDER_CONSTANT, cv::Scalar());

	for (int i = 0; i < 4; i++)
		cv::circle(dst, dstQuad[i], 5, cv::Scalar(255, 0, 255), -1, cv::LINE_AA);

	cv::imshow("Perspective Transform Test", dst);
	cv::waitKey();
}


int main()
{
	test();
	system("pause");
	return 0;
}

结果

常见的图像变换_第3张图片

三、通用变换

对数——极坐标变换示例

// Example 11-3. Log-polar transform example
// Log-polar transform example.
// This demonstrates the forward and backward (inverse) log-polar
// transform.
#include 
#include 

using namespace std;

static void test() {
	string path = "Image.jpg";
	cv::Mat src = cv::imread(path);
	if (src.empty()) {
		cout << "can not load image" << endl;
		return;
	}
	double M = 50;
	cv::Mat dst(src.size(), src.type()), src2(src.size(), src.type());

	cv::logPolar(
		src,
		dst,
		cv::Point2f(src.cols*0.5f, src.rows*0.5f),
		M,
		cv::INTER_LINEAR | cv::WARP_FILL_OUTLIERS
	);
	cv::logPolar(
		dst,
		src2,
		cv::Point2f(src.cols*0.5f, src.rows*0.5f),
		M,
		cv::INTER_LINEAR | cv::WARP_INVERSE_MAP
	);
	cv::imshow("log-polar", dst);
	cv::imshow("inverse log-polar", src2);

	cv::waitKey();
}

int main()
{
	test();
	system("pause");
	return 0;
}

结果

常见的图像变换_第4张图片

你可能感兴趣的:(Opencv,opencv,计算机视觉,c++)