在 openCV 中将 cvPoint[][] 转换为 cvPoint** 时出现段错误

Posted

技术标签:

【中文标题】在 openCV 中将 cvPoint[][] 转换为 cvPoint** 时出现段错误【英文标题】:Segment fault while convert cvPoint[][] to cvPoint** in openCV 【发布时间】:2015-04-17 14:53:36 【问题描述】:

我尝试使用 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 );
                                                                                              ^

【问题讨论】:

请使用 opencv 的 c++ api,而不是弃用的 c-api。 谢谢。我明白了,但我真的不知道我在那里做错了什么! :v 数组不是指针。特别是,数组数组不是指针数组。 这不应该是编译器错误。为什么标题为分段错误? 【参考方案1】:

您需要知道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 传递给 openCV 时,它会查看内存中 listpoint 位置中的数据(实际上是 cvPoint)并将其解释为内存中的指针,从而获取垃圾位置和分段错误 :)

编辑 - 自己试试看:

int A[4][5];
cout << A<<" "<<&A[0]<<" "<<&A[0][0]<<endl;

您将获得相同的价值 3 次!

【讨论】:

非常感谢。我刚刚意识到,如果我尝试在 listpoint[1] 访问内存。我的意图是访问第二个多边形,但实际上,我只能访问数组 listpoin 的第二个点,其中包含连续 10 个元素。 ...这是愚蠢的错误!

以上是关于在 openCV 中将 cvPoint[][] 转换为 cvPoint** 时出现段错误的主要内容,如果未能解决你的问题,请参考以下文章

opencv的基本数据类型CvPoint,CvSize,CvRect,CvScalar

OpenCV:我们是不是需要删除 CvPoint 以及如何删除?

[OpenCV学习笔记1][OpenCV基本数据类型]

OpenCV基础类型

3.1 OpenCV的基本数据类型

OpenCV结构简介