FarnebackOpticalFlow class also was changed dll name to reference.
This example is similar with here(http://study.marearts.com/2014/04/opencv-study-example-source-code-for.html).
This example will help what dll and header file need to use FarnebackOpticalFlow class.
Required Dlls are follows :
(tbb.dll is my option)
And refer to this example.
#include < iostream> #include < opencv2\opencv.hpp> #include < opencv2\highgui.hpp> //#include < opencv2\imgcodecs.hpp> #include < opencv2\videoio.hpp> #include < opencv2\core\cuda.hpp> #include < opencv2\imgproc.hpp> #include < opencv2\cudawarping.hpp> #include < opencv2\cudaimgproc.hpp> //#include < opencv2\cudaarithm.hpp> #include < opencv2\cudaoptflow.hpp> #ifdef _DEBUG #pragma comment(lib, "opencv_core300d.lib") #pragma comment(lib, "opencv_highgui300d.lib") //#pragma comment(lib, "opencv_imgcodecs300d.lib") //imread #pragma comment(lib, "opencv_videoio300d.lib") //video capture #pragma comment(lib, "opencv_imgproc300d.lib") //line, circle #pragma comment(lib, "opencv_cudawarping300d.lib") //cuda::resize #pragma comment(lib, "opencv_cudaimgproc300.lib") //cuda::cvtcolor #pragma comment(lib, "opencv_cudaarithm300d.lib") //cuda::farnebackOpticalFlow #pragma comment(lib, "opencv_cudaoptflow300d.lib") #else #pragma comment(lib, "opencv_core300.lib") #pragma comment(lib, "opencv_highgui300.lib") //#pragma comment(lib, "opencv_imgcodecs300.lib") //imread #pragma comment(lib, "opencv_videoio300.lib") //video capture #pragma comment(lib, "opencv_imgproc300.lib") // //line, circle #pragma comment(lib, "opencv_cudawarping300.lib") //cuda::resize #pragma comment(lib, "opencv_cudaimgproc300.lib") //cuda::cvtcolor #pragma comment(lib, "opencv_cudaarithm300.lib") //cuda::farnebackOpticalFlow #pragma comment(lib, "opencv_cudaoptflow300.lib") #endif using namespace std; using namespace cv; void drawOptFlowMap_gpu(const Mat& flow_xy, Mat& cflowmap, int step, const Scalar& color); int main() { int s = 1; unsigned long AAtime = 0, BBtime = 0; //variables Mat GetImg, flow_x, flow_y, next, prvs, flow_xy; //gpu variable cuda::GpuMat prvs_gpu, next_gpu, flow_x_gpu, flow_y_gpu, flow_xy_gpu; cuda::GpuMat prvs_gpu_o, next_gpu_o; cuda::GpuMat prvs_gpu_c, next_gpu_c; //file name char fileName[100] = "M:\\____videoSample____\\Rendering\\Wildlife.avi"; //video file open VideoCapture stream1(fileName); //0 is the id of video device.0 if you have only one camera if (!(stream1.read(GetImg))) //get one frame form video return 0; //gpu upload, resize, color convert prvs_gpu_o.upload(GetImg); cuda::resize(prvs_gpu_o, prvs_gpu_c, Size(GetImg.size().width / s, GetImg.size().height / s)); cuda::cvtColor(prvs_gpu_c, prvs_gpu, CV_BGR2GRAY); //dense optical flow Ptr< cuda::FarnebackOpticalFlow > fbOF = cuda::FarnebackOpticalFlow::create(); //unconditional loop while (true) { if (!(stream1.read(GetImg))) //get one frame form video break; /////////////////////////////////////////////////////////////////// //gpu upload, resize, color convert next_gpu_o.upload(GetImg); cuda::resize(next_gpu_o, next_gpu_c, Size(GetImg.size().width / s, GetImg.size().height / s)); cuda::cvtColor(next_gpu_c, next_gpu, CV_BGR2GRAY); /////////////////////////////////////////////////////////////////// AAtime = getTickCount(); //dense optical flow fbOF->calc(prvs_gpu, next_gpu, flow_xy_gpu); BBtime = getTickCount(); float pt = (BBtime - AAtime) / getTickFrequency(); float fpt = 1 / pt; printf("%.2lf / %.2lf \n", pt, fpt); //copy for vector flow drawing Mat cflow; resize(GetImg, cflow, Size(GetImg.size().width / s, GetImg.size().height / s)); flow_xy_gpu.download(flow_xy); drawOptFlowMap_gpu(flow_xy, cflow, 10, CV_RGB(0, 255, 0)); imshow("OpticalFlowFarneback", cflow); /////////////////////////////////////////////////////////////////// //Display gpumat next_gpu.download(next); prvs_gpu.download(prvs); imshow("next", next); imshow("prvs", prvs); //prvs mat update prvs_gpu = next_gpu.clone(); if (waitKey(5) >= 0) break; } return 0; } void drawOptFlowMap_gpu(const Mat& flow_xy, Mat& cflowmap, int step, const Scalar& color) { for (int y = 0; y < cflowmap.rows; y += step) for (int x = 0; x < cflowmap.cols; x += step) { Point2f fxy; fxy.x = cvRound(flow_xy.at< Vec2f >(y, x)[0] + x); fxy.y = cvRound(flow_xy.at< Vec2f >(y, x)[1] + y); cv::line(cflowmap, Point(x, y), Point(fxy.x, fxy.y), color); cv::circle(cflowmap, Point(fxy.x, fxy.y), 1, color, -1); } }
Hi Kim I tried to run the code on a machine with only CPU. I have installed openCV with CUDA support.
ReplyDeleteI get run time error->
OpenCV Error: Gpu API call (CUDA driver version is insufficient for CUDA runtime version) in allocate, file /home/sk47/opencv_home/opencv/modules/core/src/cuda/gpu_mat.cu, line 71
terminate called after throwing an instance of 'cv::Exception'
what(): /home/sk47/opencv_home/opencv/modules/core/src/cuda/gpu_mat.cu:71: error: (-217) CUDA driver version is insufficient for CUDA runtime version in function allocate
This code works with gpu.
DeleteYou said you were using a computer with only a CPU.
So I think this problem has occurred.