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

时间:2014-07-07 10:23:56

标签: c++ opencv

在Windows上使用MSVS2010进行编译

在下面的代码中,我尝试使用Line迭代器,然后在沿线提取像素值后,我试图将提取的数据传递给函数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()

1 个答案:

答案 0 :(得分:1)

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 ; 
}