OpenCV – DECODE https://decode.red/blog data decode, decoder or decoded ... design of code Mon, 15 Dec 2025 06:15:00 +0000 ja hourly 1 https://wordpress.org/?v=4.7.29 OpenCV VideoCapture ../../../20180127794/ Sat, 27 Jan 2018 13:53:00 +0000 ../../../?p=794 動体追跡でよく見かけるフレーム間差分を表示する処理について、実際にためしてみました。

環境: 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

差分を正確に表示させたかったので、あえてノイズ除去処理をはずしました。
スクリーンショットをとりやすくするため、ウェイトをいれました。

#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);
	}
}

これを基本にいろいろと処理を考えてみたいてす。

]]>
Template Matching ../../../20170115659/ Sun, 15 Jan 2017 04:41:35 +0000 ../../../?p=659 画像探索をOpenCVを使ってやってみました。

参考: http://opencv.jp/sample/matching.html

ソースはほとんどそのままですが、部分的な修正だったり自分の環境での動作確認は結構大切なので、実際に動かしてみました。

環境: Ubuntu 16.04
コンパイル

cc -o tmatch tmatch.c -lopencv_core -lopencv_highgui -lopencv_imgproc

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <stdio.h>

int
main (int argc, char **argv)
{
  double min_val, max_val;
  CvPoint min_loc, max_loc;
  CvSize dst_size;
  IplImage *src_img, *tmp_img, *dst_img;

  if (argc != 3 ||
      (src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_COLOR)) == 0 ||
      (tmp_img = cvLoadImage (argv[2], CV_LOAD_IMAGE_COLOR)) == 0){
    puts("error");
    return -1;
  }
  dst_size = cvSize (src_img->width - tmp_img->width + 1, src_img->height - tmp_img->height + 1);
  dst_img = cvCreateImage (dst_size, IPL_DEPTH_32F, 1);
  cvMatchTemplate (src_img, tmp_img, dst_img, CV_TM_CCOEFF_NORMED);
  cvMinMaxLoc (dst_img, &min_val, &max_val, &min_loc, &max_loc, NULL);

  cvRectangle (src_img, max_loc,
               cvPoint (max_loc.x + tmp_img->width, max_loc.y + tmp_img->height), CV_RGB (255, 0, 0), 2, 8, 0);
  cvNamedWindow ("Image", 1);
  cvShowImage ("Image", src_img);
  cvWaitKey (0);

  cvDestroyWindow ("Image");
  cvReleaseImage (&src_img);
  cvReleaseImage (&tmp_img);
  cvReleaseImage (&dst_img);

  return 0;
}

テスト画像は、下記で使ったLEDの写真です。
http://bitlife.me/em/2017/01/09/bit-counter-arduino/

led_tmp
一番右のLEDの部分をテンプレートとしました。
led1

次に、マッチした部分の周辺を削除したものです。
led2png
近い部分を選択してくれました。(これを確認してみたかった)

なかなか面白いですね。

]]>
Computer Vision ../../../20160928610/ Wed, 28 Sep 2016 11:19:30 +0000 ../../../?p=610 画像認識をOpenCVを使ってやってみたくなり、事始めとして画像のRGBの操作をしてみました。

OpenCV Documents:
http://docs.opencv.org/2.4/doc/tutorials/tutorials.html

環境: Ubuntu 16.04
インストール:

apt-get install libcv-dev libhighgui-dev libml-dev libcvaux-dev libopencv-photo-dev

rgb.cpp

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <iostream>
 
using namespace cv;
 
int main (int argc, char **argv)
{

	Mat img = imread("red.png");

	imshow("original", img);
	for(int y=0;y<img.rows;y++){
		Vec3b* p = img.ptr<Vec3b>(y);
		for(int x=0;x<img.cols;x++){
			Vec3b bgr = p[x];
			if(bgr[0] < 50 && bgr[1] < 50 && bgr[2] > 100){
				printf("%d,%d,%d\n", bgr[0], bgr[1], bgr[2]);
				p[x] = Vec3b(255,0,0);
			}
		}	
	} 
	imshow("edit", img);
	waitKey(0);
   
	return 0;
}

コンパイル:

g++ -o rgb rgb.cpp -lopencv_core -lopencv_highgui -lopencv_imgproc

cv01

これは赤色の部分を青色に変えた簡単なものです。
画像から何を読み取るか(コンピュータを目として)、その手法を考えるだけで、とても可能性を感じます。

]]>