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