在openCV中将cvPoint [] []转换为cvPoint **时发生段故障

时间:2015-04-17 14:53:37

标签: c++ c arrays pointers opencv

我尝试使用cvFillPoly()和cvPolyline()但它不起作用。 请帮帮我,我做错了什么?

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

int main() {

    IplImage *background;

    background = cvCreateImage( cvSize(800,600) , IPL_DEPTH_8U , 3 );

    CvPoint listpoint[][4] = {
        {cvPoint(35,70),cvPoint(160,34),cvPoint(245,570),cvPoint(23,700)},
        {cvPoint(563,341),cvPoint(20,80),cvPoint(320,40)},
        {cvPoint(350,470),cvPoint(700,599),cvPoint(400,400)}
    };

    int _npts[3] = {4,3,3};

    cvFillPoly( background , listpoint , _npts , 1 , cvScalar(255,255,255) );

    cvNamedWindow( "Drawing Things" , CV_WINDOW_AUTOSIZE );
    cvShowImage( "Drawing Things" , background );

    cvWaitKey(0);

    cvReleaseImage( &background );
    cvDestroyWindow( "Drawing Things" );

    return 0;
}

这是错误:(在Qt创建者身上)

 cannot convert 'CvPoint (*)[4]' to 'CvPoint**' for argument '2' to 'void cvPolyLine(CvArr*, CvPoint**, const int*, int, int, CvScalar, int, int, int)'
 cvPolyLine( BasedImage , listpoint , numberpoint , 1 , 0 , cvScalar(255,255,255) , 0 , CV_AA );
                                                                                              ^

1 个答案:

答案 0 :(得分:2)

你需要知道int A[4][5]int**B之间的区别:第一个在内存中连续有20个元素(以A开头),另一个有指针到内存中的int数组。

换句话说 - 在B中,您会得到一个数组列表 - 每个数组都位于不同的内存位置,每个数组都可以有不同的大小。当您查看B本身的内存位置中的数据时,您会看到指向第一个数组的指针。

A中 - 它只是一个方便的快捷方式:您可以将int A[4][5]视为int real_A[20],每次A[i][j]时,您都可以将real_A[i*5+j]视为A。实际上(在汇编代码中)A[0][0]

当您查看listpoint本身的内存位置中的数据时,您会看到cvPoint的数据。

因此当你将listpoint传递给openCV时,它会查看内存中int A[4][5]; cout << A<<" "<<&A[0]<<" "<<&A[0][0]<<endl; 位置的数据(实际上是{{1}})并将其解释为内存中的指针,获取垃圾位置和分段错误:)

编辑 - 试试看这个:

{{1}}

您将获得相同的值3次!