首页 > 解决方案 > 使用 SURF 算法运行 .cpp 代码时系统挂起

问题描述

我正在使用 openCV 和 c++ 进行图像处理。我使用 SURF 算法编写了一个代码,用于从图像中检测关键点并显示检测到的关键点。我能够构建和运行代码而不会出现任何错误。但运行代码后系统挂起。

我正在使用随 ROS 自动安装的 Ubuntu 16.04、ROS Kinetic 和 OpenCV 3.3.1。

我包含了使用 SURF 算法所需的所有头文件,并且还使用了所需的“命名空间”。我的代码主文件如下:

using namespace cv;
using namespace std
using namespace cv::xfeatures2d;
int main(int argc,char **argv)
{
ros::init(argc,argv,"image_detection");
while(1)
{
Mat temp_image=imread("/home/pelican/Pictures/sign.jpg",CV_LOAD_IMAGE_GRAYSCALE);
Mat temp_kp;

//initialize SURF
Ptr<SURF>detector=SURF::create(500,4,4,false,false);

//compute keypoints
vector<KeyPoint>kp;
detector->detect(temp_image,kp);

//display keypoints
drawKeypoints(temp_image,kp,temp_kp,Scalar(255,0,150),DrawMatchesFlags::DEFAULT);
cout<<"detected kp="<<kp.size()<<endl;

namedWindow("template_image",CV_WINDOW_NORMAL);
imshow("template_image",temp_image);
namedWindow("temp_kp",CV_WINDOW_NORMAL);
imshow("temp_kp",temp_kp);

ros::spinOnce();
if(waitKey(30)==27) //wait for esc key press for 30ms. If pressed,break loop
{
cout<<"esc key pressed"<<endl;
break;
}
}
return 0;
}

我还编辑了 CMakeLists.txt 和 Package.xml 文件。之后,我按照以下步骤操作:

  1. 罗斯科
  2. 将目录更改为 catkin_ws 并获取它。
  3. catkin_make
  4. rosrun package_name node_name

当代码开始运行时,系统挂起。所以,我只是尝试构建和运行每个步骤。我开始知道该系统工作正常,直到vector<KeyPoint>kp;。但是如果我包含该步骤,系统就会挂起detector->detect(temp_image,kp);。如果我尝试运行整个代码(以上代码),5-6 分钟后,它将显示检测到的关键点的数量以及带有图像(sign.jpg)的窗口“template_image”和“temp_kp”,但不显示在“temp_kp”中检测到关键点。最后我必须使用电源按钮强制重启系统。

我该如何解决这个问题,可能是什么原因?

提前致谢。

标签: c++opencvubuntu-16.04rossurf

解决方案


推荐阅读