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

OpenCV: Unable to correctly pass data to a function

本文关键字:数据 函数 OpenCV      更新时间:2023-10-16

使用MSVS2010在Windows上编译

在以下代码中,我尝试使用行迭代器,然后在提取像素值后,我试图将提取的数据传递给函数foo():

该图像为单通道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 ; 
}

程序的输出是:

the address in the iterateLine() is
001195D8
values in IterateLine
40092
39321
39578
46003
46774
address in foo()
001195D8
values in foo()
56797
56797
56797
56797
56797
The address in main() is
001195D8
values in main() are
56797
56797
56797
56797
56797

可以看出foo()main()的值是错误的。应该和IterateLine()报告的一致。由于地址被正确传递(见输出),所以使用指针我应该从任何函数获得相同的数据。但这并没有发生。

为什么会发生这种情况,我如何正确地将数据传递给foo() ?

void IterateLine( const Mat& image, vector<ushort>& linePixels, Point p1, Point p2 )
{
    LineIterator it(image, p1,p2, 8);
    for(int i = 0; i < it.count; i++, it++){
        linePixels.push_back(image.at<ushort>(it.pos()));
    }
}
int main()
{
    Mat img = imread("sir.png", CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH);
    vector<ushort> linePixels;        // initially empty
    IterateLine( img, linePixels, Point(1,1), Point(5,5) );  
    foo( &linePixels[0], linePixels.size() );
    return 0 ; 
}