Posted on 2018/01/27, 10:53 PM By admin22
動体追跡でよく見かけるフレーム間差分を表示する処理について、実際にためしてみました。
環境: opencv_world340d.lib(OpenCV Library) / VisualStudio 2017
参考: http://hanpakousaku.tumblr.com/post/105416471978/opencv-%E5%8B%95%E4%BD%93%E6%A4%9C%E7%9F%A5-c
動画サンプル: https://github.com/shirmung/opencv-tests/blob/master/testdata/gpu/video/768×576.avi
差分を正確に表示させたかったので、あえてノイズ除去処理をはずしました。
スクリーンショットをとりやすくするため、ウェイトをいれました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#include <windows.h> #include <opencv2/highgui/highgui.hpp> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace std; static const int th = 3; int main(void) { cv::VideoCapture cap("C:\\temp\\768x576.avi"); cv::Mat im1, im2, im3, frame; cv::Mat d1, d2, diff; cv::Mat im_mask, mask; cv::namedWindow("in"); cv::namedWindow("out"); cap >> frame; cv::cvtColor(frame, im1, CV_RGB2GRAY); cap >> frame; cv::cvtColor(frame, im2, CV_RGB2GRAY); cap >> frame; cv::cvtColor(frame, im3, CV_RGB2GRAY); while (1) { cv::absdiff(im1, im2, d1); cv::absdiff(im2, im3, d2); cv::bitwise_and(d1, d2, diff); cv::threshold(diff, mask, 5, 1, cv::THRESH_BINARY); cv::threshold(mask, im_mask, 0, 255, cv::THRESH_BINARY); vector<cv::Mat> planes; cv::split(frame, planes); cv:imshow("plane", planes[2]); //0,1,2: B,G,R cv::imshow("out", im_mask); im2.copyTo(im1, im2); im3.copyTo(im2, im3); cap >> frame; if (frame.empty()) { cv::destroyAllWindows(); break; } cv::cvtColor(frame, im3, CV_RGB2GRAY); Sleep(100); } } |
これを基本にいろいろと処理を考えてみたいてす。
Categories: 未分類 タグ: OpenCV