OpenCV中文网站

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 安装 配置
查看: 1189|回复: 1

Opencv 4.0 DIS光流算法调用示例

[复制链接]
发表于 2018-12-17 12:06:18 | 显示全部楼层 |阅读模式
调用DIS光流的源码如下:
  1. #include "opencv2/core/utility.hpp"
  2. #include "opencv2/highgui.hpp"
  3. #include "opencv2/imgproc.hpp"
  4. #include "opencv2/video.hpp"
  5. #include <iostream>
  6. using namespace std;
  7. using namespace cv;
  8. static void help()
  9. {
  10.     printf("Usage: dis_optflow <video_file>\n");
  11. }
  12. int main(int argc, char **argv)
  13. {
  14.     VideoCapture cap;
  15.     if (argc < 2)
  16.     {
  17.         help();
  18.         exit(1);
  19.     }
  20.     cap.open(argv[1]);
  21.     if(!cap.isOpened())
  22.     {
  23.         printf("ERROR: Cannot open file %s\n", argv[1]);
  24.         return -1;
  25.     }
  26.     Mat prevgray, gray, rgb, frame;
  27.     Mat flow, flow_uv[2];
  28.     Mat flow_Farneback;
  29.     Mat flow_uv_Farneback[2];
  30.     Mat mag, ang;
  31.     Mat mag_Farneback, ang_Farneback;
  32.     Mat hsv_split[3], hsv;
  33.     Mat hsv_split_Farneback[3], hsv_Farneback;
  34.     Mat rgb_Farneback;


  35.     Ptr<DenseOpticalFlow> algorithm = DISOpticalFlow::create(DISOpticalFlow::PRESET_MEDIUM);

  36.     int idx = 0;
  37.     while(true)
  38.     {
  39.         cap >> frame;
  40.         if (frame.empty())
  41.             break;
  42.         cv::resize(frame,frame,cv::Size(0.8*frame.cols,0.8*frame.rows),0,0,cv::INTER_LINEAR);
  43.         idx++;
  44.         cvtColor(frame, gray, COLOR_BGR2GRAY);
  45.         cv::imshow("orig", frame);

  46.         if (!prevgray.empty())
  47.         {
  48.             /*DISOpticalFlow*/
  49.             /*main function of DISOpticalFlow*/
  50.             algorithm->calc(prevgray, gray, flow);
  51.             split(flow, flow_uv);
  52.             multiply(flow_uv[1], -1, flow_uv[1]);
  53.             cartToPolar(flow_uv[0], flow_uv[1], mag, ang, true);
  54.             normalize(mag, mag, 0, 1, NORM_MINMAX);
  55.             hsv_split[0] = ang;
  56.             hsv_split[1] = mag;
  57.             hsv_split[2] = Mat::ones(ang.size(), ang.type());
  58.             merge(hsv_split, 3, hsv);
  59.             cvtColor(hsv, rgb, COLOR_HSV2BGR);
  60.             cv::Mat rgbU;
  61.             rgb.convertTo(rgbU, CV_8UC3,  255, 0);
  62.             cv::imshow("DISOpticalFlow", rgbU);
  63.             Mat rgbU_b = rgbU.clone();
  64.             Mat split_dis[3];
  65.             split(rgbU_b, split_dis);

  66.             split_dis[2] = prevgray;
  67.             Mat merge_dis;
  68.             merge(split_dis, 3, merge_dis);
  69.             cv::imshow("DISOpticalFlow_mask", merge_dis);
  70.             /*Farneback*/
  71.             cv::calcOpticalFlowFarneback(prevgray, gray, flow_Farneback, 0.5, 3,15, 3, 5, 1.2, 0);

  72.             split(flow_Farneback, flow_uv_Farneback);
  73.             multiply(flow_uv_Farneback[1], -1, flow_uv_Farneback[1]);
  74.             cartToPolar(flow_uv_Farneback[0], flow_uv_Farneback[1], mag_Farneback, ang_Farneback, true);
  75.             normalize(mag_Farneback, mag_Farneback, 0, 1, NORM_MINMAX);
  76.             hsv_split_Farneback[0] = ang_Farneback;
  77.             hsv_split_Farneback[1] = mag_Farneback;
  78.             hsv_split_Farneback[2] = Mat::ones(ang_Farneback.size(), ang_Farneback.type());
  79.             merge(hsv_split_Farneback, 3, hsv_Farneback);
  80.             cvtColor(hsv_Farneback, rgb_Farneback, COLOR_HSV2BGR);
  81.             cv::Mat rgbU_Farneback;
  82.             rgb_Farneback.convertTo(rgbU_Farneback, CV_8UC3,  255, 0);
  83.             cv::imshow("FlowFarneback", rgbU_Farneback);
  84.             Mat rgbU_Farneback_b = rgbU_Farneback.clone();
  85.             Mat split_Fb[3];
  86.             split(rgbU_Farneback_b, split_Fb);
  87.             split_Fb[2] = prevgray;
  88.             Mat merge_Fb;
  89.             merge(split_Fb, 3, merge_Fb);
  90.             cv::imshow("FlowFarneback_mask", merge_Fb);
  91.             cv::waitKey(1);
  92.         }


  93.         std::swap(prevgray, gray);
  94.     }

  95.     return 0;
  96. }
复制代码
对应CMakelists如下:
  1. cmake_minimum_required(VERSION 3.12)
  2. set(OpenCV_DIR "/home/fang/software/opencv4_install/lib/cmake/opencv4")
  3. project(indemind_opencv_demo)

  4. set(CMAKE_CXX_STANDARD 14)
  5. find_package(OpenCV 4 REQUIRED)
  6. include_directories( ${OpenCV_INCLUDE_DIRS})
  7. add_executable(indemind_opencv_demo main.cpp)
  8. target_link_libraries(indemind_opencv_demo
  9.         ${OpenCV_LIBS}
  10.         )
复制代码



回复

使用道具 举报

发表于 2019-1-29 17:40:40 | 显示全部楼层
楼主,DIS速度跑起来怎么样
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站  

GMT+8, 2019-6-25 00:07 , Processed in 0.031900 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表