图像的坐标映射源码如下:
#include <cv.h>
#include <highgui.h>
#include<opencv.hpp>
#include <stdio.h>
using namespace cv;
//全局变量
int a, b;
float *c;
float map_x1;
float map_y1;
int X1, Y1;
Mat src(500,500, CV_8UC3, Scalar(0, 0, 255));
Mat dst(800, 800, CV_8UC3, Scalar(0, 0, 255));
char temp[16];
int scaleRounddouble(float number)
{
return (number > 0.0) ? (number + 0.5) : (number - 0.5);
}
float* mapFunction(const Mat &src, const Mat &dst)
{
float k[2] = { 0 };
k[0] = (dst.rows)*1.0 / src.rows;
k[1] = (dst.cols)*1.0 / src.cols;
return k;
}
void on_mouse(int event, int x, int y, int flags, void* ustc)
{
if (event == CV_EVENT_LBUTTONDOWN)
{
a = x;
b = y;
CvPoint pt = cvPoint(x, y);
sprintf(temp, "(%d,%d)", pt.x, pt.y);
putText(src, temp, pt, CV_FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255, 255, 255));
circle(src, pt, 2, cvScalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0);
imshow("src", src);
}
if (event == CV_EVENT_LBUTTONUP)
{
c = mapFunction(src, dst);
map_x1 = c[0] * a;
map_y1 = c[1] * b;
X1 = scaleRounddouble(map_x1);
Y1 = scaleRounddouble(map_y1);
circle(dst, Point(X1, Y1), 1, cvScalar(255, 0, 0), 2);
sprintf(temp, "(%d,%d)", X1, Y1);
putText(dst, temp, Point(X1, Y1), CV_FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255, 255, 255));
imshow("src",dst);
}
}
int main()
{
cvNamedWindow("src", 1);
cvSetMouseCallback("src", on_mouse, 0);
imshow("src", src);
waitKey(0);
destroyAllWindows();
delete[] c;
return 0;
}