deha magazine / システム開発 / OpenCVを使ったブロブ検知の概要
OpenCVを使ったブロブ検知の概要
2020/06/19
ブロブとは塊を意味し、似た特徴を持った画像内の領域のことを指します。
OpenCVを利用すればこのブロブを簡単に検知することができます。
この記事では、そんなブロブの検知方法について具体的に紹介していきます。
- Open CVの活用方法が知りたい方
- ブロブ検知の方法を知りたい方
これらに当てはまる方におすすめの記事となっています。これを読めばブロブ検知の方法が分かりますよ。
ブロブとは?
ブロブとは塊のことです。例えば、白い紙に黒墨を溢して残った塊ごとに1つブロブとして扱われます。
Open CVを使ったブロブ検知の利用方法
ブロブ検知を利用して画像にあるブロブを見つけ、カウントします。
C++ 言語でインストールする手順:
using namespace cv;
// Read image
Mat im = imread( “blob.jpg”, IMREAD_GRAYSCALE );
// Set up the detector with default parameters.
SimpleBlobDetector detector;
// Detect blobs.
std::vector<KeyPoint> keypoints;
detector.detect( im, keypoints);
// Draw detected blobs as red circles.
// DrawMatchesFlags::DRAW_RICH_KEYPOINTS flag ensures the size of the circle corresponds to the size of blob
Mat im_with_keypoints;
drawKeypoints( im, keypoints, im_with_keypoints, Scalar(0,0,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS );
// Show blobs
imshow(“keypoints”, im_with_keypoints );
waitKey(0);
色彩、形、サイズでブロブを検知する
SimpleBlobDetectorのパラメターを設定すれば、絞り込みたいブロブを検知する事が出来ます。
SimpleBlobDetectorのパラメターを設定する方法
SimpleBlobDetector::Params params;
閾値でフィルター
// 閾値の min, max値を定める
params.minThreshold = 10;
params.maxThreshold = 200;
サイズでフィルター
params.filterByArea = true;
params.minArea = 1500;
params.maxArea = 5000;
円形度(circularity)でフィルター
params.filterByCircularity = true;
params.minCircularity = 0.1;
円形度(circularity)の数式:円形度 = 4πS / L^2
S:面積(画像数)
L:周囲長
0 < circulary < 1.
円形の近い形であればあるほど循環が1に近くなります。
凸面(convexity)でフィルター
params.filterByConvexity = true;
params.minConvexity = 0.87;
凸面 (convexity)の数式:(ブロブの面積) / (凸面の面積)
0 < convexity < 1.
Inertia Ratioでフィルター
params.filterByInertia = True
params.minInertiaRatio = 0.1
Inertia Ratioは形態の伸び率を意味します。
円形のInertia Ratio = 1
楕円形のInertia Ratio 0< Inertia Ratio< 1
直線のInertia Ratio = 0
まとめ
いかがでしたか。本日はOpenCVを利用したブロブ検知の方法を紹介していきました。
ブロブ検知で個数のカウントや位置を検知することができましたね。
dehaでは、5年ほど前から、ベトナムオフショア開発を行っています。
本日紹介したOpenCVに関して詳しく聞きたい方や、ベトナムでオフショア開発を行う際の費用が知りたい方などはぜひご気軽にお問い合わせください。