最近需要自己从底层根据算法写代码实现,需要一个函数返回多个值,由于我的项目是与opencv有关的, 需要在一个函数内返回多个double类型的值,我最开始想到的是使用Mat,我构造一个矩阵,然后将所需要的值从输出后的矩阵中获取即可,这是第一种方法,可是有很大的局限性,所以,我考虑使用结构体,好处是:可以返回多个类型的值,且在非opencv项目中同样使用;(且均适用于类的封装写法)
当然首先给出说的第一种方法吧。
我想返回4个double类型的数,可以进行如下的操作:
先给出函数实现
Mat TjCorrectImage::get_corrected_uv(Mat K, Mat RT, Mat W,double f)
{
Mat uv;
uv = K*RT*W;
//归一化平面Z=1上
double u = uv.at<double>(0, 0)/ uv.at<double>(2, 0);
double v = uv.at<double>(1, 0) / uv.at<double>(2, 0);
//像素坐标转换到图像坐标
double x = f / K.at<double>(0, 0)*(u - K.at<double>(0, 2));
double y = f / K.at<double>(1, 1)*(u - K.at<double>(1, 2));
Mat xy = (Mat_<double>(2, 1) << x,y);
return xy;
}
下面给出获取的方法
TjCorrectImage correct;
Mat x1y1_c = correct.get_corrected_uv(K, RT, W1, f);
x1_c = x1y1_c.at<double>(0, 0);
y1_c = x1y1_c.at<double>(1, 0);
这样就达到了获取2个double值的需要;
给出结构体的方法
//在头文件里
#include <iostream>
#include <fstream>
#include "opencv2/core/core.hpp"
#include "highgui/highgui.hpp"
#include "opencv2/legacy/legacy.hpp"
using namespace std;
using namespace cv;
typedef struct getxy {
double x;
double y;
}getxy;
class TjCorrectImage
{
public:
getxy get_corrected_uv(Mat K, Mat RT, Mat W, double f);
};
//在对应的cpp中,定义函数,PS:头文件自己去包含去~
getxy TjCorrectImage::get_corrected_uv(Mat K, Mat RT, Mat W,double f)
{
Mat uv;
uv = K*RT*W;
//归一化平面Z=1上
double u = uv.at<double>(0, 0)/ uv.at<double>(2, 0);
double v = uv.at<double>(1, 0) / uv.at<double>(2, 0);
//像素坐标转换到图像坐标
double x = f / K.at<double>(0, 0)*(u - K.at<double>(0, 2));
double y = f / K.at<double>(1, 1)*(u - K.at<double>(1, 2));
//Mat xy = (Mat_<double>(2, 1) << x,y);
getxy xy;
xy.x = x;
xy.y = y;
return xy;
}
//main调用
TjCorrectImage correct;
getxy x1y1_c = correct.get_corrected_uv(K, RT, W1, f);
x1_c = x1y1_c.x;
y1_c = x1y1_c.y;
还可以进行数组的传递达到目的
示例如下:
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
//函数返回数组例子
double *getxy(double x, double y)
{
static double xy[1];
//设置种子
srand((unsigned)time(NULL));
xy[0] = x;
xy[1] = y;
return xy;
}
int main()
{
double *xy;
xy = getxy(0.222, 0.9898);
double a = *(xy);
cout << a << endl;
return 0;
}