Visual Studio 2013 Express Visual C++( アンマネージドコード ) OpenCV 3.1 |
■267.OpenCV 2値画像中の輪郭抽出 | Prev Top Next | |
|
2値画像中の輪郭を抽出します。今回使用する関数は、輪郭を点ベクトルとして取得できることがポイントとなります。
#include <iostream> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc.hpp> #pragma comment( lib, "opencv_world300d.lib" ) int main(int argc, const char* argv[]) { int hr = -1; try { cv::Mat src, dst; std::vector<std::vector<cv::Point>> contours; src = cv::imread("D:/TEMP/MaverickProj/Image/OpenCV/29/Texture.png", cv::IMREAD_GRAYSCALE); cv::threshold(src, // 入力配列(シングルチャンネル,8ビット,あるいは32ビット浮動小数点型). dst, 200, // 閾値. 255, // 閾値処理の種類が THRESH_BINARY や THRESH_BINARY_INV の場合に利用される,最大値の値. cv::THRESH_BINARY // 閾値処理の種類._INVを指定すると階調反転 ); cv::namedWindow("2値画像", 1); cv::imshow("2値画像", dst); // 2値画像中の輪郭を検出 findContours(dst, // 入力画像,8ビット,シングルチャンネル.0以外のピクセルは 1 、0のピクセルは0として扱う。処理結果として image を書き換えることに注意する. contours, // 輪郭を点ベクトルとして取得する CV_RETR_EXTERNAL, // 輪郭抽出モード CV_CHAIN_APPROX_NONE // 輪郭の近似手法 ); cv::namedWindow("Source", 1); cv::imshow("Source", src); cv::namedWindow("輪郭抽出", 1); cv::imshow("輪郭抽出", dst); cv::waitKey(0); hr = 0; } catch (cv::Exception ex) { std::cout << ex.err << std::endl; } // ウィンドウの破棄 cv::destroyAllWindows(); return hr; }元画像
2値画像
輪郭抽出 mode = CV_RETR_EXTERNAL
輪郭抽出 mode = CV_RETR_LIST
輪郭抽出 mode = CV_RETR_CCOMP
輪郭抽出 mode = CV_RETR_TREE