Visual Studio 2013 Express Visual C++( アンマネージドコード ) OpenCV 3.1 |
■275.OpenCV 点群を上をいい感じにとおる線分を描画 | Prev Top Next | |
|
2 次元あるいは 3 次元の点集合に直線をフィッティングするらしい。
#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, mask, bgdmodel, fgdmodel, dst; std::vector<std::vector<cv::Point>> contours; std::vector<cv::Vec4i> hierarchy; src = cv::imread("D:/TEMP/MaverickProj/Image/OpenCV/37/Texture.png", cv::IMREAD_COLOR); // 前景、背景領域分離 cv::grabCut(src, // 8ビット,3チャンネルの入力画像. mask, // 8ビット,シングルチャンネルの入出力マスク. cv::Rect(80, 170, 360, 60), // 前景かもしれない矩形領域 bgdmodel, // 一時領域 fgdmodel, // 一時領域 3, // アルゴリズムの反復回数 cv::GC_INIT_WITH_RECT // 処理モード.GC_INIT_WITH_RECT の場合rectを使用してmaskを初期化する ); // 前景かもしれないピクセルを抽出 cv::compare(mask, // マスク画像 cv::GC_PR_FGD, // 前景かもしれないピクセル dst, cv::CMP_EQ // 一致しているピクセルを取得 ); // 2値画像中の輪郭を検出 cv::findContours(dst, // 入力画像,8ビット,シングルチャンネル.0以外のピクセルは 1 、0のピクセルは0として扱う。処理結果として image を書き換えることに注意する. contours, // 輪郭を点ベクトルとして取得する hierarchy, // hiararchy ? オプション.画像のトポロジーに関する情報を含む出力ベクトル. CV_RETR_EXTERNAL, // 輪郭抽出モード CV_CHAIN_APPROX_NONE // 輪郭の近似手法 ); cv::namedWindow("Source", 1); cv::imshow("Source", src); cv::Vec4f line; for (int i = 0; i >= 0; i = hierarchy[i][0]) { // 2 次元あるいは 3 次元の点集合に直線をフィッティング cv::fitLine(contours[i], line, CV_DIST_L2, 0, 0.01, 0.01); // 線分を描画 cv::line(src, cv::Point(line.val[2] - line.val[0] * 20.0, line.val[3] - line.val[1] * 20.0), // 1つ目の線分の座標 cv::Point(line.val[2] + line.val[0] * 20.0, line.val[3] + line.val[1] * 20.0), // 2つ目の線分の座標 cv::Scalar(0, 0, 255), // 色 2, // 太さ cv::LINE_8 ); } cv::namedWindow("line", 1); cv::imshow("line", src); cv::waitKey(0); hr = 0; } catch (cv::Exception ex) { std::cout << ex.err << std::endl; } // ウィンドウの破棄 cv::destroyAllWindows(); return hr; }元画像
点群をいい感じにとおる線分