基于Qt 稠密光流farnaeback cuda接口 

将opencv 稠密光流farnaeback cuda  接口 简答记录一下

#include <iostream>
#include <vector>
#include <sstream>
#include <cmath>

#include "opencv2/core.hpp"
#include "opencv2/core/utility.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/video.hpp"
#include "opencv2/cudaoptflow.hpp"
#include "opencv2/cudaarithm.hpp"

using namespace std;
using namespace cv;
using namespace cv::cuda;

template <typename T>
inline T mapVal(T x, T a, T b, T c, T d)
{
    x = ::max(::min(x, b), a);
    return c + (d-c) * (x-a) / (b-a);
}

static void colorizeFlow(const Mat &u, const Mat &v, Mat &dst)
{
    double uMin, uMax;
    cv::minMaxLoc(u, &uMin, &uMax, 0, 0);
    double vMin, vMax;
    cv::minMaxLoc(v, &vMin, &vMax, 0, 0);
    uMin = ::abs(uMin); uMax = ::abs(uMax);
    vMin = ::abs(vMin); vMax = ::abs(vMax);
    float dMax = static_cast<float>(std::max(std::max(uMin, uMax), std::max(vMin, vMax)));

    dst.create(u.size(), CV_8UC3);
    for (int y = 0; y < u.rows; ++y)
    {
        for (int x = 0; x < u.cols; ++x)
        {
            dst.at<uchar>(y,3*x) = 0;
            dst.at<uchar>(y,3*x+1) = (uchar)mapVal(-v.at<float>(y,x), -dMax, dMax, 0.f, 255.f);
            dst.at<uchar>(y,3*x+2) = (uchar)mapVal(u.at<float>(y,x), -dMax, dMax, 0.f, 255.f);
        }
    }
}


int main(int argc, char **argv)
{
    const std::string rtsp_or_video_addr="/home/wang/images/drums10.mp4";
    cv::VideoCapture cap(rtsp_or_video_addr);
    if(!cap.isOpened()){
        std::cout<<"frame capture failed!\n";
        return -1;
    }
    Mat frame;
    Mat curGray,prevGray;
    namedWindow("flow",WINDOW_NORMAL);

    Ptr<cuda::FarnebackOpticalFlow> d_calc = cuda::FarnebackOpticalFlow::create();
    cv::Mat flowx, flowy, image;
    bool running=true;
    while (running)
    {
        cap>>frame;
        cvtColor(frame,curGray,COLOR_BGR2GRAY);
        if(!prevGray.empty()){
            GpuMat gpuPrevFrame(prevGray);
            GpuMat gpuCurFrame(curGray);
            GpuMat flowMat;
            d_calc->calc(gpuPrevFrame, gpuCurFrame, flowMat);

            GpuMat planes[2];
            cuda::split(flowMat, planes);

            planes[0].download(flowx);
            planes[1].download(flowy);

            colorizeFlow(flowx, flowy, image);
            //motionToColor(image,image);

            cv::imshow("flow", image);
            cv::waitKey(3);
        }
        std::swap(prevGray,curGray);
    }

    return 0;
}

配置文件:

QT -= gui

CONFIG += c++11 console
CONFIG -= app_bundle

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
        main.cpp
INCLUDEPATH += /usr/local/include\
                /usr/local/include/opencv\
                /usr/local/include/opencv2\


LIBS +=/usr/local/lib/libopencv_*.so\

        /usr/local/cuda-9.0/lib64/libcudart.so.9.0\
        /usr/local/cuda-9.0/lib64/libcudnn.so.7\
        /usr/local/cuda-9.0/lib64/libcurand.so.9.0\
        /usr/local/cuda-9.0/lib64/libcublas.so.9.0

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值