Hello,
I’m currently trying to use the OpenCV Cuda functions, but I’m getting “Invalid device function/symbol” errors, whenever I try to run a program using those gpu functions.
OpenCV Error: Gpu API call (invalid device function) in call, file /home/OpenCV/opencv-2.4.11/modules/gpu/include/opencv2/gpu/device/detail/transform_detail.hpp, line 361
Error: /home/OpenCV/opencv-2.4.11/modules/gpu/include/opencv2/gpu/device/detail/transform_detail.hpp:361: error: (-217) invalid device function in function call
But I get no compiling errors.
I came up with a simple example of OpenCV-GPU Code, where I get the “Invalid device function” error.
int main(int argc, char** argv)
{
ros::init(argc, argv, "Testlauf"); //Init ros node
cv::Mat src_host = cv::imread("aux_00000048.jpg", CV_LOAD_IMAGE_GRAYSCALE);
cv::gpu::GpuMat dst, src;
src.upload(src_host);
cv::gpu::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY);
cv::Mat result_host(dst);
cv::imshow("Result", result_host);
cv::waitKey();
return 0;
}
I think there is something wrong with the way I build the code in my CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.3)
project(Test)
find_package(catkin REQUIRED COMPONENTS
cv_bridge
dynamic_reconfigure
image_geometry
image_proc
image_transport
message_filters
nodelet
roscpp
sensor_msgs
std_msgs
stereo_msgs
)
set(WITH_CUDA=ON)
set(CMAKE_BUILD_TYPE RelWithDebInfo)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
find_package(OpenCV REQUIRED)
find_package(CUDA REQUIRED)
INCLUDE(FindCUDA)
SET(CUDA_NVCC_FLAGS "--gpu-architecture=sm_50" CACHE STRING "nvcc flags" FORCE)
set(${CUDA_LIBRARIES} ${CUDA_npp_LIBRARY} ${CUDA_cublas_LIBRARY} ${CUDA_cufft_LIBRARY})
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMY_DEF=1" )
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DMY_DEF=1" )
set(CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE OFF)
set(BUILD_SHARED_LIBS ON)
SET (CUDA_VERBOSE_BUILD ON CACHE BOOL "nvcc verbose" FORCE)
list(APPEND CUDA_NVCC_FLAGS "-std=c++11;-O2;-DVERBOSE;-res-usage")
SET(CUDA_PROPAGATE_HOST_FLAGS OFF)
SET(LIB_TYPE STATIC)
catkin_package(
CATKIN_DEPENDS image_geometry image_proc sensor_msgs stereo_msgs
INCLUDE_DIRS include
LIBRARIES ${PROJECT_NAME}
)
include_directories(
${catkin_INCLUDE_DIRS}
${CUDA_INCLUDE_DIRECTORIES}
"/usr/include/pcl-1.7"
"/usr/include/eigen3"
)
LINK_DIRECTORIES (
"/opt/cuda/lib64"
)
add_executable(TE src/test.cpp)
target_link_libraries( TE ${catkin_LIBRARIES} )
OpenCV was built using this:
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_OPENGL=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 ..
I use the NVidia Geforce GTX 850M graphics card, with the compute compability 5.0 on an ASUS N550JK Latop.
Does someone see, why it doesn’t work?