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

微信公众号:码出名企路—图像处理技巧2

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

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

//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, …> 返回两个及以上

#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

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. 结构体

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. 引用

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;
 }
              **扫一扫,搜一搜
               收看更多精彩内容**

在这里插入图片描述
初衷:学习资料,程序设计,视觉图像,SLAM算法,求职经验,工作心得,招聘信息等分享

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: FFmpeg是一个免费的、跨平台的多媒体框架,可以用于处理音频、视频以及流媒体等不同类型的多媒体数据。如果需要给一个视频加上多个水印,可以使用FFmpeg提供的filter_complex滤镜进行实现。 filter_complex 可以将多个滤镜拼接起来,实现多种效果,其一个滤镜是水印。在加多个水印的情况下,需要使用多个overlay滤镜,每个滤镜对应一个水印。可以使用如下命令: ffmpeg -i input.mp4 -i watermark1.png -i watermark2.png -filter_complex "[0:v][1:v]overlay=W-w-10:H-h-10[o1];[o1][2:v]overlay=W-w-20:H-h-20" output.mp4 此命令,input.mp4 是要加水印的源视频;watermark1.png 和 watermark2.png 分别是两个水印图像;filter_complex "[0:v][1:v]overlay=W-w-10:H-h-10[o1];[o1][2:v]overlay=W-w-20:H-h-20" 的[o1]是间结果,表示第一次overlay加水印后的输出。第二次overlay再在此输出上加水印,最终结果是加上了两个水印的视频。 其 W-w-x 和 H-h-y 表示水印距离输出视频右边缘和底部的距离,x 和 y 的数可以适当调整。此命令执行后会返回处理的日志信息和输出的视频文件路径。 总之,只需在滤镜依次使用overlay并设置每个水印的位置,就可以实现为视频加多个水印。 ### 回答2: ffmpeg是一款功能强大的开源多媒体处理工具,能够对音频、视频等各种多媒体格式进行转换、编辑等处理。其,添加水印是一种常见的视频编辑需求,而在实际应用,有时需要在同一视频加入多个水印。 ffmpeg添加水印的基本命令如下: ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4 其,input.mp4为源视频文件,watermark.png为水印图片文件,overlay=10:10表示水印位置为视频左上角偏移(10,10)的位置,output.mp4为输出文件名。 如果要在同一视频加入多个水印,需要使用复合滤镜(filter_complex),如下所示: ffmpeg -i input.mp4 -i watermark1.png -i watermark2.png -filter_complex "[1:v]overlay=10:10[wm1];[2:v]overlay=50:50[wm2];[0:v][wm1][wm2]overlay=100:100" output.mp4 其,[1:v]表示第一个水印,[2:v]表示第二个水印,overlay=10:10表示第一个水印位置为视频左上角偏移(10,10)的位置,overlay=50:50表示第二个水印位置为左上角偏移(50,50)的位置,最后的overlay=100:100表示将第一个和第二个水印叠加到源视频上,并输出至output.mp4。 需要注意的是,添加多个水印可能会影响视频的观感,因此在添加水印时,应尽量保持简洁、合理的布局和透明度,以达到更好的效果。同时,ffmpeg支持多种滤镜效果,如模糊、旋转、缩放等,可以进一步增强视频的视觉效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值