Visual Studio 2013 Express Visual C++( アンマネージドコード ) OpenCV 3.1 |
■266.OpenCV 前景画像の抽出 | Prev Top Next | |
|
入力画像から前景領域を抽出します。
#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, dst2, mul; src = cv::imread("D:/TEMP/MaverickProj/Image/OpenCV/28/Texture.png", cv::IMREAD_COLOR); // 前景、背景領域分離 cv::grabCut(src, // 8ビット,3チャンネルの入力画像. mask, // 8ビット,シングルチャンネルの入出力マスク. cv::Rect( 50, 6, 180, 174 ), // 前景かもしれない矩形領域 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 // 一致しているピクセルを取得 ); // 積算合成するため3チャンネルに増やす dst2 = cv::Mat(dst.rows, dst.cols, CV_8UC3); int from_to[] = { 0, 2, 0, 1, 0, 0 }; cv::mixChannels(&dst, 1, &dst2, 1, from_to, 3); // チャンネル数チェック std::cout << "channels => " << src.channels() << ":" << dst2.channels() << std::endl; // [ 0 - 1 ]に変換して積算合成 cv::multiply(src, dst2 / 255.0, mul); cv::namedWindow("Source", 1); cv::imshow("Source", src); cv::namedWindow("dst2", 1); cv::imshow("dst2", dst2); cv::namedWindow("mul", 1); cv::imshow("mul", mul); cv::waitKey(0); hr = 0; } catch (cv::Exception ex) { std::cout << ex.err << std::endl; } // ウィンドウの破棄 cv::destroyAllWindows(); return hr; }元画像
マスク
前景画像