Visual Studio 2013 Express Visual C++( アンマネージドコード ) OpenCV 3.1 |
■290.OpenCV MSER 抽出アルゴリズムによる領域検出 | Prev Top Next | |
|
MSER 抽出アルゴリズムを使用して領域検出します
#include <iostream> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/features2d.hpp> #pragma comment( lib, "opencv_world300d.lib" ) int main(int argc, const char* argv[]) { int hr = -1; try { cv::Mat src, dst_point, dst_rect; std::vector<std::vector<cv::Point>> points; std::vector<cv::Rect> rects; // 画像読み込み src = cv::imread("D:/TEMP/MaverickProj/Image/OpenCV/52/Texture.png", cv::IMREAD_GRAYSCALE); cv::namedWindow("src", 1); imshow("src", src); dst_point = cv::Mat::zeros(src.rows, src.cols, CV_8UC3); dst_rect = cv::Mat::zeros(src.rows, src.cols, CV_8UC3); // src[0] -> dst[2], src[0] -> dst[1], src[0] -> dst[0] // て感じでコピー元インデックスとコピー先インデックスを指定する int fromTo[] = { 0, 2, 0, 1, 0, 0 }; // シングルチャンネルを3チャンネルに増やして、コピーする cv::mixChannels(&src, 1, &dst_point, 1, fromTo, 3); cv::mixChannels(&src, 1, &dst_rect, 1, fromTo, 3); // Maximally-Stable Extremal Region 抽出器. cv::Ptr<cv::MSER> mser = cv::MSER::create(); mser->detectRegions(src, points, rects); int cnt = 0; for (auto point : points) { // 大きい領域は除外する if (point.size() < 200) { for ( auto point2 : point ) { // 点の描画 cv::circle(dst_point, point2, 1, cv::Scalar(0, 0, 255), 1); } } } cv::namedWindow("MSER Point", 1); imshow("MSER Point", dst_point); for (auto rect : rects) { // 大きい領域は除外する if (rect.width < 40 && rect.height < 40) { // 矩形の描画 cv::rectangle(dst_rect, rect, cv::Scalar(0, 0, 255), 1); } } cv::namedWindow("MSER Rect", 1); imshow("MSER Rect", dst_rect); cv::waitKey(0); hr = 0; } catch (cv::Exception ex) { std::cout << ex.err << std::endl; } // ウィンドウの破棄 cv::destroyAllWindows(); return hr; }元画像
点群による領域検出
矩形による検出