在创建指向 Mat 向量的指针时,表达式列表在初始化程序中被视为复合表达式

Posted

技术标签:

【中文标题】在创建指向 Mat 向量的指针时,表达式列表在初始化程序中被视为复合表达式【英文标题】:expression list treated as compound expression in initializer in creating a Pointer to a vector of Mat's 【发布时间】:2014-04-13 14:47:05 【问题描述】:

当我尝试将一个 c 数组提供给将 Mat 的 C 数组转换为 C++ 向量的函数时,我在这一行 vector<Mat> *std_carrayTovectorm(m, 2); 上收到以下错误消息。我认为我的代码是正确的,但不确定是否是我的 std_carrayTovectorm 函数是问题所在。如何编辑我创建的 C 数组或 std_carrayTovectorm 函数以从 C 数组创建 Mat 的向量。

谢谢

//表达式列表在初始化器中被视为复合表达式 //从‘int’到‘std::vector*’的无效转换

typedef vector<Mat> vector_Mat;

    vector_Mat* std_carrayTovectorm(Mat* a, size_t len) 
        vector<Mat>* v = new vector<Mat>;
        for(size_t i = 0; i < len; i++) 
            v->push_back(a[i]);
        return v;
    


    int main( int argc, char** argv )
    

        Mat img1 = imread( "/home/w/d1");
        Mat img2 = imread( "/home/w/d1");

        Mat* m[2] =  new Mat (img1), new Mat (img2) ;
        vector<Mat> *std_carrayTovectorm(m, 2);

        return 0;
        

【问题讨论】:

m 是一个指向 Mat 的指针数组,std_carrayTovectorm 需要一个 Mat 数组。 【参考方案1】:

关于指针有一些问题...你在 main 中粘贴了一个函数的原型并且忘记删除返回类型!

这是一个经过修改的程序,可让您重回正轨。请注意,我将vector_Mat 修改为指向Mat 的指针向量...

#include<iostream>
#include<cmath>

#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
using namespace std;
using namespace cv;

typedef vector<Mat*> vector_Mat;

vector_Mat* std_carrayTovectorm(Mat** a, size_t len) 
    vector_Mat* v = new vector_Mat();
    for(size_t i = 0; i < len; i++) 
        v->push_back(a[i]);
    return v;



int main( int argc, char** argv )


    Mat img1 = imread( "one.jpg");
    Mat img2 = imread( "two.jpg");

    Mat* m[2] =  &img1, &img2 ;
    vector_Mat* v=std_carrayTovectorm(m, 2);

    imwrite("three.jpg",*((*v)[0]));
    imwrite("four.jpg",*((*v)[1]));
            delete v;
    return 0;
    

再见,

编辑:不修改vector_Mat

#include<iostream>
#include<cmath>

#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
using namespace std;
using namespace cv;

typedef vector<Mat> vector_Mat;

vector_Mat* std_carrayTovectorm(Mat** a, size_t len) 
    vector_Mat* v = new vector_Mat();
    for(size_t i = 0; i < len; i++) 
        v->push_back(*a[i]);
    return v;



int main( int argc, char** argv )


    Mat img1 = imread( "one.jpg");
    Mat img2 = imread( "two.jpg");

    Mat* m[2] =  &img1, &img2 ;
    vector_Mat* v=std_carrayTovectorm(m, 2);

    imwrite("three.jpg",((*v)[0]));
    imwrite("four.jpg",((*v)[1]));

    delete v;
    return 0;
 

再见,

【讨论】:

....感谢您对此的帮助...效果很好...但我的同事不想让我更改 vector_Mat*...您还有其他建议吗? @user3517736 : 你的同事是对的,不用修改vector_Mat 很容易做到。我相应地编辑了我的答案。

以上是关于在创建指向 Mat 向量的指针时,表达式列表在初始化程序中被视为复合表达式的主要内容,如果未能解决你的问题,请参考以下文章

c++“cv::Mat::row”: 函数调用缺少参数列表;请使用“&cv::Mat::row”创建指向成员的指针?

使用 unordered_map 值初始化指向向量的指针时出错

从 2D 向量创建 1D 向量的函数(错误:表达式必须具有指向对象的指针类型)

当向量在内部类中时,如何删除指向对象的向量指针

初始化指向指针的指针向量

用向量 c++ 中的指针成员初始化对象