Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV:无法将数据正确传递给函数_C++_Opencv - Fatal编程技术网

C++ OpenCV:无法将数据正确传递给函数

C++ OpenCV:无法将数据正确传递给函数,c++,opencv,C++,Opencv,使用MSVS2010在Windows上编译 int foo(unsigned short int *values, unsigned int nSamples) { cout<<"address in PlotMeNow"<<endl; cout<<&values[0]<<endl; cout<<"values in PlotMeNow"<<endl; for(int i=0;i

使用MSVS2010在Windows上编译

int foo(unsigned short int *values,  unsigned int nSamples)
{
    cout<<"address in PlotMeNow"<<endl;
    cout<<&values[0]<<endl; 
    cout<<"values in PlotMeNow"<<endl;

    for(int i=0;i<5;i++){
        cout<<values[i]<<endl;
    }
    return 0;  
}

unsigned short int * IterateLine(Mat image)
{
    LineIterator it(image, Point(1,1), Point(5,5), 8);
    vector<ushort> buf;

    for(int i = 0; i < it.count; i++, it++){
        buf.push_back(image.at<ushort>(it.pos()));
    }

    std::vector<ushort> data(5);
    data=buf; 

    cout<<"the  address in the iterateLine() is"<<endl; 
    cout<<&data[0]<<endl; 

    cout<<"values in IterateLine"<<endl;
    for(int i=0;i<5;i++){
        cout<<data[i]<<endl;
    }
     return &data[0]; 
}

int main()
{

    Mat img = imread("sir.png", CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH);
    unsigned short int * x ; 
    //Iterate through the line  
    x =  IterateLine(img); 

    int n=5; 
    foo(&x[0], n);

    cout<<"The address in main() is"<<endl; 
    cout<<x<<endl; 
    cout<<"values in main are"<<endl;

    for(int i=0;i<5;i++){  
        cout<<x[i]<<endl;
    }     
    getch();
    return 0 ; 
}
在下面的代码中,我尝试使用行迭代器,然后在沿行提取像素值后,我尝试将提取的数据传递给函数
foo()

int foo(unsigned short int *values,  unsigned int nSamples)
{
    cout<<"address in PlotMeNow"<<endl;
    cout<<&values[0]<<endl; 
    cout<<"values in PlotMeNow"<<endl;

    for(int i=0;i<5;i++){
        cout<<values[i]<<endl;
    }
    return 0;  
}

unsigned short int * IterateLine(Mat image)
{
    LineIterator it(image, Point(1,1), Point(5,5), 8);
    vector<ushort> buf;

    for(int i = 0; i < it.count; i++, it++){
        buf.push_back(image.at<ushort>(it.pos()));
    }

    std::vector<ushort> data(5);
    data=buf; 

    cout<<"the  address in the iterateLine() is"<<endl; 
    cout<<&data[0]<<endl; 

    cout<<"values in IterateLine"<<endl;
    for(int i=0;i<5;i++){
        cout<<data[i]<<endl;
    }
     return &data[0]; 
}

int main()
{

    Mat img = imread("sir.png", CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH);
    unsigned short int * x ; 
    //Iterate through the line  
    x =  IterateLine(img); 

    int n=5; 
    foo(&x[0], n);

    cout<<"The address in main() is"<<endl; 
    cout<<x<<endl; 
    cout<<"values in main are"<<endl;

    for(int i=0;i<5;i++){  
        cout<<x[i]<<endl;
    }     
    getch();
    return 0 ; 
}
图像为单通道16位png

int foo(unsigned short int *values,  unsigned int nSamples)
{
    cout<<"address in PlotMeNow"<<endl;
    cout<<&values[0]<<endl; 
    cout<<"values in PlotMeNow"<<endl;

    for(int i=0;i<5;i++){
        cout<<values[i]<<endl;
    }
    return 0;  
}

unsigned short int * IterateLine(Mat image)
{
    LineIterator it(image, Point(1,1), Point(5,5), 8);
    vector<ushort> buf;

    for(int i = 0; i < it.count; i++, it++){
        buf.push_back(image.at<ushort>(it.pos()));
    }

    std::vector<ushort> data(5);
    data=buf; 

    cout<<"the  address in the iterateLine() is"<<endl; 
    cout<<&data[0]<<endl; 

    cout<<"values in IterateLine"<<endl;
    for(int i=0;i<5;i++){
        cout<<data[i]<<endl;
    }
     return &data[0]; 
}

int main()
{

    Mat img = imread("sir.png", CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH);
    unsigned short int * x ; 
    //Iterate through the line  
    x =  IterateLine(img); 

    int n=5; 
    foo(&x[0], n);

    cout<<"The address in main() is"<<endl; 
    cout<<x<<endl; 
    cout<<"values in main are"<<endl;

    for(int i=0;i<5;i++){  
        cout<<x[i]<<endl;
    }     
    getch();
    return 0 ; 
}
可以看出,值
foo()
main()
是错误的。它应该与
IterateLine()
报告的相同。由于地址的传递是正确的(见输出),所以使用指针,我应该从任何函数中获得相同的数据。但这并没有发生

int foo(unsigned short int *values,  unsigned int nSamples)
{
    cout<<"address in PlotMeNow"<<endl;
    cout<<&values[0]<<endl; 
    cout<<"values in PlotMeNow"<<endl;

    for(int i=0;i<5;i++){
        cout<<values[i]<<endl;
    }
    return 0;  
}

unsigned short int * IterateLine(Mat image)
{
    LineIterator it(image, Point(1,1), Point(5,5), 8);
    vector<ushort> buf;

    for(int i = 0; i < it.count; i++, it++){
        buf.push_back(image.at<ushort>(it.pos()));
    }

    std::vector<ushort> data(5);
    data=buf; 

    cout<<"the  address in the iterateLine() is"<<endl; 
    cout<<&data[0]<<endl; 

    cout<<"values in IterateLine"<<endl;
    for(int i=0;i<5;i++){
        cout<<data[i]<<endl;
    }
     return &data[0]; 
}

int main()
{

    Mat img = imread("sir.png", CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH);
    unsigned short int * x ; 
    //Iterate through the line  
    x =  IterateLine(img); 

    int n=5; 
    foo(&x[0], n);

    cout<<"The address in main() is"<<endl; 
    cout<<x<<endl; 
    cout<<"values in main are"<<endl;

    for(int i=0;i<5;i++){  
        cout<<x[i]<<endl;
    }     
    getch();
    return 0 ; 
}
为什么会发生这种情况?如何正确地将数据传递到
foo()

void IterateLine(常数矩阵和图像、向量和线像素、点p1、点p2)
int foo(unsigned short int *values,  unsigned int nSamples)
{
    cout<<"address in PlotMeNow"<<endl;
    cout<<&values[0]<<endl; 
    cout<<"values in PlotMeNow"<<endl;

    for(int i=0;i<5;i++){
        cout<<values[i]<<endl;
    }
    return 0;  
}

unsigned short int * IterateLine(Mat image)
{
    LineIterator it(image, Point(1,1), Point(5,5), 8);
    vector<ushort> buf;

    for(int i = 0; i < it.count; i++, it++){
        buf.push_back(image.at<ushort>(it.pos()));
    }

    std::vector<ushort> data(5);
    data=buf; 

    cout<<"the  address in the iterateLine() is"<<endl; 
    cout<<&data[0]<<endl; 

    cout<<"values in IterateLine"<<endl;
    for(int i=0;i<5;i++){
        cout<<data[i]<<endl;
    }
     return &data[0]; 
}

int main()
{

    Mat img = imread("sir.png", CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH);
    unsigned short int * x ; 
    //Iterate through the line  
    x =  IterateLine(img); 

    int n=5; 
    foo(&x[0], n);

    cout<<"The address in main() is"<<endl; 
    cout<<x<<endl; 
    cout<<"values in main are"<<endl;

    for(int i=0;i<5;i++){  
        cout<<x[i]<<endl;
    }     
    getch();
    return 0 ; 
}
{ 行迭代器it(图像,p1,p2,8); for(int i=0;i
您正在从
IterateLine
返回指向本地数据的指针。这是未定义的行为。您应该先解决这个问题。@juanchopanza但当地址相同时,为什么数据会不同?因为其他东西会将其他数据放在那里,因为它可以?@juanchopanza地址001195D8和001195D8+1处的值对于不同的函数不能不同。我错了吗?谁在乎?你有未定义的行为。这是一个错误。首先修复它。谢谢,我必须为点(X1,X2),点(Y1,Y2)传递第三个参数。我的函数有三个参数。