ROS: OpenCV SURF is there but can't be found [closed]
I was able to run OpenCV with ROS. I have run basic things (like loading images, getting video stream ect) but I am trying to run SURF or SIFT and I get this error:
Linking CXX executable /home/jim/ROS/catkin_ws/devel/lib/opencv_ros/open
CMakeFiles/open.dir/src/open.cpp.o: In function `main':
open.cpp:(.text+0x15b): undefined reference to `cv::SURF::SURF(double, int, int, bool, bool)'
CMakeFiles/open.dir/src/open.cpp.o: In function `cv::SURF::~SURF()':
open.cpp:(.text._ZN2cv4SURFD1Ev[_ZN2cv4SURFD1Ev]+0xe): undefined reference to `vtable for cv::SURF'
open.cpp:(.text._ZN2cv4SURFD1Ev[_ZN2cv4SURFD1Ev]+0x26): undefined reference to `vtable for cv::SURF'
open.cpp:(.text._ZN2cv4SURFD1Ev[_ZN2cv4SURFD1Ev]+0x2e): undefined reference to `vtable for cv::SURF'
open.cpp:(.text._ZN2cv4SURFD1Ev[_ZN2cv4SURFD1Ev]+0x3b): undefined reference to `VTT for cv::SURF'
collect2: error: ld returned 1 exit status
make[2]: *** [/home/jim/ROS/catkin_ws/devel/lib/opencv_ros/open] Error 1
make[1]: *** [opencv_ros/CMakeFiles/open.dir/all] Error 2
make: *** [all] Error 2
Invoking "make" failed
The project name is "opencv_ros" and the code is in "open.cpp". I have include these headers:
#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/nonfree/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/nonfree/nonfree.hpp"
the thing is that when I run the same code in my c++ IDE (code::blocks) it runs just fine. I even found the header file and saw that it's in the correct place (according to the include I gave).
In the ROS ask website, they told me that I am doing something wrong with OpenCV and the make file. They said I should ask here for help. Here is my CMakeLists.txt :
cmake_minimum_required(VERSION 2.8.3)
project(opencv_ros)
find_package(catkin REQUIRED COMPONENTS
cv_bridge
image_transport
roscpp
sensor_msgs
std_msgs
)
catkin_package( CATKIN_DEPENDS cv_bridge image_transport roscpp sensor_msgs std_msgs )
include_directories(${catkin_INCLUDE_DIRS})
add_executable(open src/open.cpp)
target_link_libraries(open ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})
add_dependencies(open opencv_ros_generate_messages_cpp)
I am running ubuntu 14.04 64bit on Indigo with OpenCV 2.4.9 .
Why cant it find SURF or SIFT in ROS?
your headers look correct, it's a linker problem though. one way or other, you're missing the opencv_nonfree lib. try something like:
@berak I did what you said but now I get new error /usr/bin/ld: cannot find -lopencv_nonfree collect2: error: ld returned 1 exit status now what? why am I missing only opencv_nonfree and not any other lib?
tbh, i got no idea about ROS. sorry.
@berak hey there. I was looking for the OpenCV folder I found something interesting. I have ubuntu 14.04 and went to /usr/include/opencv2 and saw that I am missing two modules (according to the OpenCV 2.4.9 documentation). There where no folders named "nonfree" and "viz". Probably this is my problem. Any idea how to fix this? How can I add them to my system?
I remember that when I build openCV I included in the options the nonfree module, for sure :/ .
nonfree is the one, and you can safely rule out the viz module (which is about rendering 3d pointclouds)
maybe it is all about building the ROS package with cmake -DBUILD_opencv_nonfree=ON ? (or similar)
@berak the thing is I am trying to use the nonfree module in a openCV project (nothing to do with ROS) and I can't now. I reinstalled OpenCV and I guess that made the problem. But now I can see the nonfree module does not exist at all. How can I add it now to my OpenCV library ?
again, check what's set for cmake -DBUILD_opencv_nonfree=ON originally, and change it
another thing, you're sure you're on 2.4.9 ? do a
git branch
to be sure (if the src was from github)SURF and SIFT got moved to https://github.com/itseez/opencv_contrib in 3.0
@berak I'm sorry for being annoying but I am really trying to understand what is going on. Not so good with this stuff yet.
I am using the GUI CMake. I download the source and build it. When I build it, the option "BUILD_opencv_nonfree" is selected (it is true). What do you mean to check what is selected and how to change it?
it's not you, who is annoying, it's this thing ... ;)
if BUILD_opencv_nonfree is selected there, it should be build.
i'm a bit out of ideas. were there any error messages ? something in the cmake output ?
@berak I don't remember any error messages or any special output. I am not sure now if there was anything in particular. If I use CMake to build it again and then "make" the library again, will that make any problems or will it just add anything that is not where is should be?