QT5+OpenCV团块运动检测

#include <opencv2/features2d/features2d.hpp>
#include <opencv2/core.hpp>
#include <opencv2/core/utility.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/video/background_segm.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>

using namespace std;
using namespace cv;

void detect(Mat mask,Mat img)
{
   SimpleBlobDetector::Params params;

   params.minThreshold = 20;//二值化的起始阈值
   params.maxThreshold = 180;//二值化的终止阈值
   params.thresholdStep = 10;//二值化的阈值步长

   params.minConvexity = 0.5f;//斑点的最小凸度 默认0.95f
   params.minInertiaRatio = 0.03f;//斑点的最小惯性率 默认0.1f
   params.minArea = 120;//斑点的最小面积
   params.maxArea = 5000;//斑点的最大面积
   params.blobColor = 255;//检测白色

//   重复的最小次数,只有属于灰度图像斑点的那些二值图像斑点数量大于该值时,该灰度图像斑点才被认为是特征点
//   params.minRepeatability = 2;
//   最小的斑点距离,不同二值图像的斑点间距离小于该值时,被认为是同一个位置的斑点,否则是不同位置上的斑点
//   params.minDistBetweenBlobs = 10;

   Ptr<SimpleBlobDetector> detector = SimpleBlobDetector::create(params);

   vector<KeyPoint> key_points;

   detector->detect(mask,key_points);

   Mat output_img;

   drawKeypoints( img, key_points, output_img, Scalar(0,0,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS );

   imshow("SimpleBlobDetector", output_img);
}

int main()
{
    string file = "test.avi";
    string method = "mog2";    //knn or mog2
    VideoCapture cap;

    cap.open(file.c_str());

    if( !cap.isOpened() )
    {
        printf("can not open camera or video file\n");
        return -1;
    }

    namedWindow("image", WINDOW_NORMAL);
    namedWindow("foreground mask", WINDOW_NORMAL);
    namedWindow("SimpleBlobDetector");

    Ptr<BackgroundSubtractor> bg_model = method == "knn" ?
            createBackgroundSubtractorKNN().dynamicCast<BackgroundSubtractor>() :
            createBackgroundSubtractorMOG2().dynamicCast<BackgroundSubtractor>();

    Mat img0, img, fgmask, fgimg;

    for(;;)
    {
        cap >> img0;
        if( img0.empty() )
            break;

        resize(img0, img, Size(600, 600*img0.rows/img0.cols), INTER_LINEAR);

        if( fgimg.empty() )
          fgimg.create(img.size(), img.type());

        //更新模型
        bg_model->apply(img, fgmask,-1);

        // 腐蚀
        erode(fgmask, fgmask, Mat());
        // 膨胀
        dilate(fgmask, fgmask, Mat());

        fgimg = Scalar::all(0);
        img.copyTo(fgimg, fgmask);

        Mat bgimg;
        bg_model->getBackgroundImage(bgimg);

        imshow("image", img);
        detect(fgmask,img);
        imshow("foreground mask", fgmask);

        char k = (char)waitKey(25);
        if( k == 27 ) break;
    }
    return 0;
}


效果如图QT5+OpenCV团块运动检测_第1张图片


参考:
OpenCV运动检测跟踪(blob track)框架组成模块详解
Opencv2.4.9源码分析——SimpleBlobDetector

你可能感兴趣的:(qt,opencv,qt5)