图像处理中C++如何同时返回多个值

2022-06-16 14:27:28 浏览数 (1)

1 . pair<T,T> 返回两个值

代码语言:javascript复制
//返回两个值的情况
pair<vector<double>,int>  R_R(Mat& img)
{   
   int n=img.rows;
   vector<double> a;
   unsigned int m=img.cols;
   unsigned int k=img.rows;
    for(unsigned int i=0;i<m;i  )
    {
        for(unsigned int j=0;j<k;j  )
        {
            a.push_back(img.at<double>(i,j));
        }
    }
   pair<vector<double>,int> data = std::make_pair(a,n);
   return data;
}

int main()
{   
   Mat img=imread("./1.png");
   pair<vector<double>,int> m_m=R_R(img);
   auto m_m=R_R(img);
   cout<<m_m.first[100]<<" "<<m_m.second<<endl;
   
   //或者定义如下接收函数值
   vector<double> m;
    int k;
   std::tie(m,k)=m_m=R_R(img);
   cout<<m[100]<<" "<<k<<endl;
   
   return 0;
 }

补充pair

代码语言:javascript复制
//1
vector<pair<int,double>> a;
a.push_back(make_pair(i,j));
cout<<a[i].first<<" "<<a[i].second<<endl;

//定义
pair<T1, T2> p1;           //创建一个空的pair对象(使用默认构造),它的两个元素分别是T1和T2类型,采用值初始化。
pair<T1, T2> p1(v1, v2);   //创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,second成员初始化为v2。
make_pair(v1, v2);         // 以v1和v2的值创建一个新的pair对象,其元素类型分别是v1和v2的类型。
p1 < p2;                   // 两个pair对象间的小于运算,其定义遵循字典次序:如 p1.first < p2.first 或者 !(p2.first < p1.first) && (p1.second < p2.second) 则返回true。
p1 == p2;// 如果两个对象的first和second依次相等,则这两个对象相等;该运算使用元素的==操作符。
p1.first;                  // 返回对象p1中名为first的公有数据成员
p1.second;

//创建与初始化
pair<string, string> ob;          // 创建一个空对象ob,两个元素类型都是string
pair<string, int> a;           // 创建一个空对象 a, 两个元素类型分别是string和int类型
pair<string, vector<int> > b;    // 创建一个空对象b,两个元素类型分别是string和vector类型

//排序
//默认
pair<int,int>Item[n];    //定义pair对象数组Item[n]
sort(Item, Item n);   //默认对Item的first的值进行排序
//自定义函数
bool cmp(pair<int, int>a, pair<int, int>b)
{
    return a.first<b.first;            //根据fisrt的值升序排序
} 
bool cmp(pair<int, int>a, pair<int, int>b)
{
    return a.second>b.second;//根据second的值升序排序
} 
sort(Item, Item n, cmp);// 按照自定义的顺序进行排序

//自定义pair类型
typedef pair<int, int>P;

2 . tuple<T, T , T, ....> 返回两个及以上

代码语言:javascript复制
#include <tuple>
//返回多个值的情况, 
std::tuple<Mat , int,Point , vector<double> > foo(Mat& img)
{   
    Mat A=img;
    int a=img.cols;
    Point B=Point(img.cols,img.rows);
    vector<double> b;

    unsigned int m=img.cols;
    unsigned int n=img.rows;
    for(unsigned int i=0;i<m;i  )
    {
        for(unsigned int j=0;j<n;j  )
        {
            b.push_back(img.at<double>(i,j));
        }
    }
    return std::make_tuple(A, a,B,b);
}

int main()
{   
    Mat img=imread("./1.png");
    std::tuple<Mat , int,Point , vector<double> > ss= foo(img);
    auto ss=foo(img);
    cout<<get<1>(ss)<<" "<<get<2>(ss).x<<" "<<get<3>(ss)[100]<<endl;
   
    //或者返回如下定义
   Mat A; int a; Point B; vector<double> b;
   tie(A,a,B,b)=foo(img);
   cout<<a<<" "<<B.x<<" "<<B.y<<endl;
    
    return 0;
}

补充tuple

代码语言:javascript复制
tuple(int,string) foo();
tie(a,b)=foo();
b.c_str();

//返回元素个数
std::tuple<int, double, std::string> t(64, 128.0, "Caroline");  
std::tuple<std::string, std::string, int> t2 =  
            std::make_tuple("Caroline", "Wendy", 1992)
size_t num = std::tuple_size<decltype(t)>::value;  
std::cout << "num = " << num << std::endl; 
 
  //获取第1个值的元素类型  
std::tuple_element<1, decltype(t)>::type cnt = std::get<1>(t);  
std::cout << "cnt = " << cnt << std::endl;   
  
 //比较  
 std::tuple<int, int> ti(24, 48);  
 std::tuple<double, double> td(28.0, 56.0);  
 bool b = (ti < td);  
 std::cout << "b = " << b << std::endl; 

3. 结构体

代码语言:javascript复制
struct Rect_Img
{
    Mat A;
    int a;
    Point B;
    vector<double> b;
};

Rect_Img Mul;

Rect_Img mul_R(Mat img)
{
    
    Mul.A=img;
    Mul.a=img.rows;
    Mul.B=Point(img.cols,img.rows);
    unsigned int m=img.cols;
    unsigned int n=img.rows;

    for(unsigned int i=0;i<m;i  )
    {
        for(unsigned int j=0;j<n;j  )
        {
            Mul.b.push_back(img.at<double>(i,j));
        }
    }
    return Mul;
}

int main()
{   
    Mat img=imread("./1.png");
    Rect_Img mull=mul_R(img);
    cout<<mull.a<<" "<<mull.B.x<<" "<<mull.B.y<<endl;
    return 0;
 }

4. 引用

代码语言:javascript复制
void Mul_R(Mat& A,int& a,Point& B ,vector<double>& b,Mat& img)
{
    A=img;
    a=img.rows;
    B=Point(img.cols,img.rows);
    unsigned int m=img.cols;
    unsigned int n=img.rows;
    for(unsigned int i=0;i<m;i  )
    {
        for(unsigned int j=0;j<n;j  )
        {
            b.push_back(img.at<double>(i,j));
        }
    }
}

int main()
{   
    Mat A;int a;Point B ;vector<double> b;
   Mul_R( A, a,B , b,img);
   cout<<a<<" "<<B.x<<" "<<B.y<<endl;
     return 0;
 }

博主:菜鸟程序员

初衷:学习资料,程序设计,视觉算法,求职经验,工作心得

0 人点赞