在 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