fanfuhan OpenCV 教學109 ~ opencv-109-BLOB特徵分析(simpleblobdetector使用) [元件 檢測/標記/定位/偵測/分割/抓取]

fanfuhan OpenCV 教學109 ~ opencv-109-BLOB特徵分析(simpleblobdetector使用) [元件 檢測/標記/定位/偵測/分割/抓取]

fanfuhan OpenCV 教學109 ~ opencv-109-BLOB特徵分析(simpleblobdetector使用) [元件 檢測/標記/定位/偵測/分割/抓取]


資料來源: https://fanfuhan.github.io/

https://fanfuhan.github.io/2019/05/22/opencv-109/

GITHUB:https://github.com/jash-git/fanfuhan_ML_OpenCV


BLOB是圖像中灰度塊的一種專業稱呼,更加變通一點的可以說它跟我們前面二值圖像分析的聯通組件類似,通過特徵提取中的SimpleBlobDetector可以實現常見的各種灰度BLOB對象組件檢測與分離。使用該檢測器的時候,可以根據需要輸入不同參數,得到的結果跟輸入的參數息息相關。

常見的BLOB分析支持如下:
   ~根據BLOB面積(大小)過濾
   ~根據灰度/顏色值過濾
   ~根據圓度過濾
   ~根據長軸與短軸過濾

   ~根據凹凸進行過濾


C++

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	// 加载图像
	Mat src = imread("D:/images/blob2.png");
	Mat gray;
	cvtColor(src, gray, COLOR_BGR2GRAY);

	// 初始化参数设置
	SimpleBlobDetector::Params params;
	params.minThreshold = 10;
	params.maxThreshold = 200;
	params.filterByArea = true;
	params.minArea = 100;
	params.filterByCircularity = true;
	params.minCircularity = 0.1;
	params.filterByConvexity = true;
	params.minConvexity = 0.87;
	params.filterByInertia = true;
	params.minInertiaRatio = 0.01;

	// 创建BLOB Detetor
	Ptr<SimpleBlobDetector> detector = SimpleBlobDetector::create(params);

	// BLOB分析与显示
	Mat result;
	vector<KeyPoint> keypoints;
	detector->detect(gray, keypoints);
	drawKeypoints(src, keypoints, result, Scalar(0, 0, 255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
	imshow("Blob Detection Demo", result);
	waitKey(0);
}

Python

"""
BLOB特征分析(simpleblobdetector使用)
"""

import cv2 as cv

frame = cv.imread("images/zhifang_ball.png")
cv.imshow("input", frame)
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
params = cv.SimpleBlobDetector_Params()

# change thresholds
params.minThreshold = 0
params.maxThreshold = 256

# filter by area
params.filterByArea = True
params.minArea = 100

# filter by circularity
params.filterByCircularity = True
params.minCircularity = 0.1

# Filter by Convexity
params.filterByConvexity = True
params.minConvexity = 0.5

# Filter by Inertia
params.filterByInertia = True
params.minInertiaRatio = 0.5

# 提取关键点
detector = cv.SimpleBlobDetector_create(params)
keypoints = detector.detect(gray)
for marker in keypoints:
    result = cv.drawMarker(frame, tuple(int(i) for i in marker.pt), color=(0, 255, 0))
cv.imshow("result", result)

cv.waitKey(0)
cv.destroyAllWindows()

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *