gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:29:21 25 4
gpt4 key购买 nike

我尝试使用 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 creator 上)

 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 );
^

最佳答案

你需要知道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 次相同的值!

关于c++ - 在 openCV 中将 cvPoint[][] 转换为 cvPoint** 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29702630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com