Handson opencv!...

19
画像処理ライブラリを使って面白いプログラムを作ろう! 長崎県立大学 国際情報学部 情報メディア学科 吉村ゼミ

Transcript of Handson opencv!...

Page 1: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

画像処理ライブラリを使って面白いプログラムを作ろう!

長崎県立大学 国際情報学部 情報メディア学科 吉村ゼミ

Page 2: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

先週やったこと

• 黄色を抽出するプログラムを作る

Page 3: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

今週やること

• 黄色を認識したらブラウザでWebページを表示する

Page 4: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

色抽出プログラムの解説

• カメラの映像を取得するだけならば,ウィンドウサイズの指定は特にしなくても良い

• これからは色情報→画素値を扱っていくので,ウィンドウサイズが明確に決まっていないとプログラムは動いてくれない

Mat src_video; // サイズを特に指定しない行列を作る

Mat src_video(Size(640,480),CV_8UC1,Scalar::all(255));

// サイズが640×480のカラー画像で,行列の全ての画素を255で埋める(真っ白の画像を作る)

Page 5: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

RGB色空間→HSV色空間への変換

• 通常OpenCVはRGB色空間で画像を扱うが,HSV色空間へ変換することも可能

• cvtColor(smooth_video, hsv_video, CV_BGR2HSV);

• 引数は左から,変換元の画像,変換後の画像,変換タイプ

• CV_BGR2HSVを指定すると,RGB色空間からHSV色空間へ変換してくれる

Page 6: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

色の抽出

• http://www.color-sample.com/colors/3559/

• この黄色を認識するには, • Hue:55°

• Saturation:100%

• Value(Brightness):95%

を指定すればよい

Page 7: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

OpenCVでのHSV色情報の取得

• OpenCVでは, • Hue:0~180度(つまり2分の1)

• Satulation:0~255

• Value:0~255

で表現されるので,各値を変換しなければならない…つまり • Hue:55/2=22.5

• Saturation:255.0*1.0=255.0

• Value:255.0*0.95=242.25

のように変換するとよい

Page 8: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

OpenCVでのHSV色情報の取得

Page 9: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

このような式を使えば,HSVの各値が取れる

hue = hsv_video.at<Vec3b>(y, x)[0];

sat = hsv_video.at<Vec3b>(y, x)[1];

val = hsv_video.at<Vec3b>(y, x)[2];

OpenCVでのHSV色情報の取得

Page 10: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

OpenCVでのHSV色情報の取得 • Hue:55/2=22.5

• Saturation:255.0*1.0=255.0

• Value:255.0*0.95=242.25

以上の値を含むような条件式を作る(条件は緩めに!)

if ((hue < 35 && hue > 20) && sat > 127) {

dst_img.at<uchar>(y, x) = 255;

}else {

dst_img.at<uchar>(y, x) = 0;

}

黄色の条件に一致する画素は白,一致しないものは黒として,結果画像(dst_img)を作成する

Page 11: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

色を認識してWebページを開く

Page 12: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

条件

• 黄色の画素を1000個以上発見したら,プログラムを止めてWebブラウザを起動し,指定したWebページへアクセスする

Page 13: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

ヘッダファイルの追加

#include <iostream>

#include <windows.h>

#include <shellapi.h>

#include <opencv2/opencv.hpp>

#include <opencv2/opencv_lib.hpp>

#include <opencv2/highgui/highgui.hpp>

#pragma comment(lib, "shell32.lib")

Page 14: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

変数の追加

bool browser_flag = false; // プログラムを止めるための変数

int y_aria = 0; // 黄色の画素をカウントする変数

Page 15: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

条件式の変更(1)

while (browser_flag != true){

dst_img = Scalar::all(0);

y_aria = 0;

・ browser_flagがtrueではないとき,カメラでのキャプチャを行うように

条件式を変更する.さらに,黄色の画素をカウントする変数を入れる

Page 16: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

条件式の変更(2)

if ((hue < 35 && hue > 20) && sat > 127){

dst_img.at<uchar>(y, x) = 255;

y_aria++;

} else {

dst_img.at<uchar>(y, x) = 0;

}

黄色の画素を発見したら、随時加算し黄色の画素の総数を計算する

Page 17: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

条件式の変更(3)

imshow("認識結果",dst_img);

if (y_aria >1000) browser_flag = true;

黄色の画素が1000個以上見つかったら,browser_flagの値をtrueにする

→While文が止まり,カメラキャプチャが終了する

Page 18: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

Webブラウザの起動とURLの指定

指定したURLをWebブラウザで開いてくれる関数

ShellExecute(0, 0, L"http://www.saruku.info/course/Y139.html", 0, 0, SW_SHOW);

ShellExecute()関数はWindowsで決められたソフトウェア(ブラウザ,メモ帳,Office,…)を起動し,指定したファイルを開いてくれる関数

引数の中にはURLが指定されている

Page 19: Handson opencv! 画像処理ライブラリを使って面白いプログラムを作ろう!その4

エラーが出る!

• OKボタンを押して終了してください… • 「 VisualStudio2015 再頒布用」で検索→一番上のリンクをクリック