cvGoodFeaturesToTrack() 与 cv::Mat 会导致内存访问冲突

问题描述 投票:0回答:1

我尝试在 Visual Studio 2010 中使用

cvGoodFeatureToTrack
函数,图像类型为
Mat
。我见过的大多数示例都使用
IplImage
指针。 现在我有这个:

int w, h; // video frame size

Mat grayFrame;
Mat eigImage;
Mat tempImage;
const int MAX_CORNERS = 10;
CvPoint2D32f corners[MAX_CORNERS] = {0};
int corner_count = MAX_CORNERS;
double quality_level = 0.1;
double min_distance = 10;
int eig_block_size = 3;
int use_harris = false;

w = CurrFrame.size().width;
h = CurrFrame.size().height;
cvtColor(CurrFrame, grayFrame, CV_BGR2GRAY);
cvGoodFeaturesToTrack(&grayFrame,
                      &eigImage,
                      &tempImage,
                      corners,
                      &corner_count,
                      quality_level,
                      min_distance,
                      NULL,
                      eig_block_size,
                      use_harris);

它可以编译,但会出现内存访问冲突。救命!

c++ opencv segmentation-fault access-violation
1个回答
8
投票

作为起点,如果无论如何都使用 C++(就像您使用

cv::Mat
cv::cvtColor
所建议的那样),那么为什么不使用 C++ 接口来完成其余部分呢?

这意味着使用

cv::goodFeaturesToTrack
cv::GoodFeaturesToTrackDetector
,它们是为
cv::Mat
和朋友而设计的,而不是从
cv::Mat
IplImage*
进行不必要的转换。

cv::Mat grayFrame;
std::vector<cv::Point2f> corners;
double quality_level = 0.1;
double min_distance = 10;
int eig_block_size = 3;
int use_harris = false;

const int MAX_CORNERS = 10;
cv::cvtColor(CurrFrame, grayFrame, CV_BGR2GRAY);
cv::goodFeaturesToTrack(grayFrame,
                        corners,
                        MAX_CORNERS,
                        quality_level,
                        min_distance,
                        cv::noArray(), 
                        eig_block_size,
                        use_harris);
© www.soinside.com 2019 - 2024. All rights reserved.