OpenCVSharp 4.5 视频目标追踪 - meanshift算法

用OpenCVSharp 4.5 跑一遍 OpenCV 官方教程

原OpenCV官方教程链接:OpenCV: Meanshift and Camshift

核心函数:meanShift

using System;
using OpenCvSharp;

namespace ConsoleApp1
{
    class tutorial37 : ITutorial
    {
        public void Run()
        {
            string filename = @"I:\csharp\videos\slow_traffic_small.mp4";

            VideoCapture capture = new VideoCapture(filename);
            if (!capture.IsOpened())
            {
                //error in opening the video input
                Console.WriteLine("Unable to open file!");
                return;
            }

            Mat frame = new Mat(), roi = new Mat(), hsv_roi = new Mat(), mask = new Mat();
            // take first frame of the video
            capture.Read(frame);

            // setup initial location of window
            Rect track_window = new Rect(300, 200, 100, 50); // simply hardcoded the values

            // set up the ROI for tracking
            roi = frame[track_window];
            Cv2.NamedWindow("ROI", WindowFlags.AutoSize);
            Cv2.ImShow("ROI", roi);

            Cv2.CvtColor(roi, hsv_roi, ColorConversionCodes.BGR2HSV);
            Cv2.InRange(hsv_roi, new Scalar(0, 60, 32), new Scalar(180, 255, 255), mask);

            float[] range_ = { 0, 180 };
            float[][] range = { range_ };
            Mat roi_hist = new Mat();
            int[] histSize = { 180 };
            int[] channels = { 0 };
            Cv2.CalcHist(new Mat[] { hsv_roi }, channels, mask, roi_hist, 1, histSize, range);

            Cv2.Normalize(roi_hist, roi_hist, 0, 255, NormTypes.MinMax);

            // Setup the termination criteria, either 10 iteration or move by atleast 1 pt
            TermCriteria term_crit = new TermCriteria(CriteriaTypes.Eps | CriteriaTypes.Count, 10, 1);

            while (true)
            {
                Mat hsv = new Mat(), dst = new Mat();
                capture.Read(frame);
                if (frame.Empty())
                    break;
                Cv2.CvtColor(frame, hsv, ColorConversionCodes.BGR2HSV);
                Rangef[] ranges = new Rangef[] { new Rangef(0, 180) };
                Cv2.CalcBackProject(new Mat[] { hsv }, channels, roi_hist, dst, ranges);

                // apply meanshift to get the new location
                Cv2.MeanShift(dst, ref track_window, term_crit);

                // Draw it on image

                Cv2.Rectangle(frame, track_window, 255, 2);
                Cv2.ImShow("img2", frame);

                int keyboard = Cv2.WaitKey(30);
                if (keyboard == 'q' || keyboard == 27)
                    break;
            }

        }
    }
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于OpenCV实现的优化版MeanShift目标跟踪算法的C++代码: ```c++ #include <opencv2/opencv.hpp> using namespace cv; int main() { VideoCapture capture(0); Mat frame, hsv_frame, mask, hist; Rect track_window; int hbins = 30, sbins = 32, histSize[] = { hbins, sbins }; float hranges[] = { 0, 180 }, sranges[] = { 0, 256 }; const float* ranges[] = { hranges, sranges }; while (waitKey(30) != 27) { capture >> frame; if (frame.empty()) break; // 将BGR图像转化为HSV图像 cvtColor(frame, hsv_frame, COLOR_BGR2HSV); // 提取目标区域的直方图 inRange(hsv_frame, Scalar(0, 60, 32), Scalar(180, 255, 255), mask); calcHist(&hsv_frame, 1, 0, mask, hist, 2, histSize, ranges, true, false); normalize(hist, hist, 0, 255, NORM_MINMAX); // 进行MeanShift目标跟踪 track_window = Rect(0, 0, frame.cols, frame.rows); TermCriteria criteria(TermCriteria::EPS | TermCriteria::COUNT, 10, 1); meanShift(hsv_frame, track_window, criteria); rectangle(frame, track_window, Scalar(0, 0, 255), 3); // 显示图像 imshow("MeanShift Object Tracking", frame); } return 0; } ``` 以上代码中,通过调用`meanShift()`函数实现了优化版MeanShift目标跟踪算法。该算法首先将BGR图像转化为HSV图像,然后提取目标区域的直方图,并对直方图进行归一化处理。接着,调用`meanShift()`函数进行目标跟踪,最后在原图像上绘制出目标区域的矩形框。 通过运行以上代码,可以实现优化版MeanShift目标跟踪算法,并在屏幕上显示跟踪结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值