连续多帧图像光流对齐和光流运动检测

光流运动检测

本方案适用于手持设备拍摄连续多帧拍摄,  使用光流检测场景运动信息.

1. 由于设备或者手抖动, 产生画面的整体偏移--需要先对齐不同的帧.

2. 为了计算性能, 将原始输入图, resize到较小尺寸(此处采用320x200).

3. 从大图直接resize到小图容易产生明显的摩尔纹, 此处采用三级下采样, 有效避免摩尔纹的干扰.

主要流程

  1. 预测多帧图像的相对清晰度
    通过sobel算子,计算不同帧的图像平均梯度值sobelValue, 代表相对清晰度.sobelValue最大的作为Reference, 并根据sobelValue利用统计分析, 标出不可用的BlurImg.

  2. 光流对齐
    Reference下采样到目标Size(OPT_W, OPT_H).

遍历其他帧(除了Ref img和Blur img), 同样下采样到Size(OPT_W, OPT_H). 进行光流对齐


    cv::Mat smallRef, resize1, resize2;
    cv::Mat inputRef(cropheight, cropwidth, CV_8UC1, (uint8_t*)pBuffers[refIdx]);

    cv::resize(inputRef, resize1, cv::Size(OPT_W*4, OPT_H*4), cv::INTER_CUBIC);
    cv::resize(resize1, resize2, cv::Size(OPT_W*2, OPT_H*2), cv::INTER_CUBIC);
    cv::resize(resize2, smallRef, cv::Size(OPT_W, OPT_H), cv::INTER_CUBIC);

    uint8_t* pSmallBuffers[7];
    for(int k=0;k<burstImgNum;k++) {
        pSmallBuffers[k] = (uint8_t*)malloc(OPT_W*OPT_H);
        if(!pSmallBuffers[k] )
            return;
    }

    for(int imgId = 0; imgId < burstImgNum; imgId++) {
        if(imgId == refIdx || imgIsBlur[imgId] == true) continue;

        cv::Mat smallNoise;
        cv::Mat inputNoise(cropheight, cropwidth, CV_8UC1, (uint8_t*)pBuffers[imgId]);
        cv::Mat alignSmall(OPT_H, OPT_W, CV_8UC1, (uint8_t*)pSmallBuffers[imgId]);

        cv::resize(inputNoise, resize1, cv::Size(OPT_W*4, OPT_H*4), cv::INTER_CUBIC);
        cv::resize(resize1, resize2, cv::Size(OPT_W*2, OPT_H*2), cv::INTER_CUBIC);
        cv::resize(resize2, smallNoise, cv::Size(OPT_W, OPT_H), cv::INTER_CUBIC);

        alignWithDenseOpticalFlow(smallNoise, smallRef, alignSmall);
        }

    &#x5149;&#x6D41;&#x5BF9;&#x9F50;&#x90E8;&#x5206;&#x4EE3;&#x7801;alignWithDenseOpticalFlow
void alignWithDenseOpticalFlow(cv::Mat& imMov, cv::Mat& imRef, cv::Mat& imAli)
{
    Mat matFlow;

    calcOpticalFlowFarneback(imRef, imMov, matFlow, 0.5, 3, 15, 3, 5, 1.2, 0);

    std::vector<float> sort_x;
    std::vector<float> sort_y;
    for(int y=30; y<150; y+=12){
        for(int x=40; x<280; x+=24){
            sort_x.push_back(matFlow.at<cv::Vec2f>(y, x)[0]);
            sort_y.push_back(matFlow.at<cv::Vec2f>(y, x)[1]);

        }
    }

    std::sort(sort_x.begin(), sort_x.end());
    std::sort(sort_y.begin(), sort_y.end());

    float sum_x = 0.0, sum_y = 0.0;
    for(int i=40; i<60; i++){
        sum_x += sort_x.at(i);
        sum_y += sort_y.at(i);
    }
    sum_x /= 20.0;
    sum_y /= 20.0;

    Mat map(matFlow.size(), CV_32FC2);
    for (int y = 0; y < map.rows; ++y)
    {
        for (int x = 0; x < map.cols; ++x)
        {
            map.at<Point2f>(y, x) = Point2f(x + sum_x, y + sum_y);
        }
    }

    Mat mapping[2];
    split(map, mapping);
    remap(imMov, imAli, mapping[0], mapping[1], INTER_CUBIC);

}

  1. 光流运动场检测.

使用opencv api –calcOpticalFlowFarneback计算稠密光流(高频场景有噪声, 感觉稀疏光流可以一试, 后话了, 先交作业…),
由于上面的alignment, 引起图像的平移, 边缘应舍弃, 对光流图裁掉边缘.

根据光流场, 计算每个像素位置的光流强度并缩放到可视化的范围.

统计光流强度, 通过阈值判断运动场景.

int getMotionPixels(cv::Mat& iRefFrame, cv::Mat& iCurrFrame, float optThresh)
{
    int iCount = 0;
    cv::Mat matFlow;

    calcOpticalFlowFarneback(iRefFrame, iCurrFrame, matFlow, 0.5, 3, 15, 3, 5, 1.2, 0);

    matFlow = matFlow(Rect(iRefFrame.cols*0.1, iRefFrame.rows*0.1,  iRefFrame.cols*0.8, iRefFrame.rows*0.8));

    for (int i = 0; i < matFlow.rows; i++)
    {
        for (int j = 0; j < matFlow.cols; j++)
        {
            float tmp0 = matFlow.at<cv::Vec2f>(i, j)[0];
            float tmp1 = matFlow.at<cv::Vec2f>(i, j)[1];
            float fImp = sqrt(tmp0 * tmp0 + tmp1 * tmp1);

            if( fImp*51 > optThresh) iCount++;
        }
    }

    std::cout<< "***********************Motion pixels     >       "<< optThresh << " iCount: "<< iCount << endl;
    return iCount;
}

效果对比

1, 输入图4k原图, 连续4帧

连续多帧图像光流对齐和光流运动检测
2. 对齐之前

连续多帧图像光流对齐和光流运动检测

3, 去掉摩尔纹, 对齐后

连续多帧图像光流对齐和光流运动检测
  1. 高频场景存在得问题. 感觉可以结合稀疏光流试试

连续多帧图像光流对齐和光流运动检测
  1. 静态场景光流图

连续多帧图像光流对齐和光流运动检测
  1. 动态场景, 光流图
    连续多帧图像光流对齐和光流运动检测

Original: https://blog.csdn.net/weixin_45331269/article/details/122454966
Author: young_s%
Title: 连续多帧图像光流对齐和光流运动检测

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/703265/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球