变换后图片
代码
// 以Center为极坐标原点,将RowFrom到RowTo的圆环,仅仅变换该范围内的点,忽略掉其他部分。
#include"polar_transeforme.hpp"#include
using namespace cv; void calculate_map(int rouFrom, int rouTo, Point2d center, Mat& map) { int heightDst = map.size().height; int widthDst = map.size().width; float dTheta = 2 * PAI / heightDst; for (int r = 0; r < heightDst; r++) { float* pRow = (float*)map.data + r * 2 * widthDst; float curTheta = r * dTheta; float cosTheta = cos(curTheta); float sinTheta = sin(curTheta); for (int c = 0; c < widthDst; c++) { float* pCur = pRow + c * 2; int rou = c + rouFrom; *pCur = rou * cosTheta + center.x; pCur++; *pCur = center.y - rou * sinTheta; } } } Mat polar_transeforme(Mat& oriImage, int rouFrom, int rouTo, Point2d center) { int heightDst = 2 * PAI * rouFrom; int widthDst = rouTo - rouFrom; Mat map(Size(widthDst, heightDst), CV_32FC2); calculate_map(rouFrom, rouTo, center, map); Mat dstMat; remap(oriImage, dstMat, map, Mat(), INTER_CUBIC, 0); return dstMat; } Point2d polar2Origin(Point2d p, Point2d center, int rouFrom, float dTheta) { float theta = p.y / rouFrom; float rou = p.x; float tempX = center.x + rou * sin(theta); float tempY = center.y - rou * cos(theta); return Point2d(tempX, tempY); } int main() { const std::string strImagePath ="示例图片.jpg"; Mat oriImg = imread(strImagePath, IMREAD_GRAYSCALE); Point2d center(237, 237); int rouFrom = 110; int rouTo = 230; Mat polarImg = polar_transeforme(oriImg, rouFrom, rouTo, center); int test = 0; return 0; }