C++ opencv的圓轉矩形,極座標轉笛卡爾座標系

翟羽嚄發表於2020-10-29

先上效果圖

原圖
在這裡插入圖片描述
轉換後:
在這裡插入圖片描述

程式碼

引數說明:源圖、目標圖,目標圖高度、目標圖寬度

bool polar_to_cartesian(cv::Mat& mat_p, cv::Mat& mat_c, int rows_c, int cols_c)
{
	mat_c = cv::Mat::zeros(rows_c, cols_c, CV_8UC1);

	int polar_d = mat_p.cols;
	double polar_r = polar_d / 2.0; // 圓圖半徑

	double delta_r = polar_r / rows_c; //半徑因子
	double delta_t = 2.0*PI / cols_c;  //角度因子

	double center_polar_x = (polar_d - 1) / 2.0;
	double center_polar_y = (polar_d - 1) / 2.0;

	for (int i = 0; i < cols_c; i++)
	{
		double theta_p = i * delta_t; //方圖第i列在圓圖對應線的角度
		double sin_theta = std::sin(theta_p);
		double cos_theta = std::cos(theta_p);

		for (int j = 0; j < rows_c; j++)
		{
			double temp_r = j * delta_r; //方圖第j行在圓圖上對應的半徑長度

			int polar_x = (int)(center_polar_x + temp_r * cos_theta);
			int polar_y = (int)(center_polar_y - temp_r * sin_theta);

			mat_c.ptr<uchar>(j)[i] = mat_p.ptr<uchar>(polar_y)[polar_x];
		}
	}
	return true;
}

相關文章