Visual Studio 2013 Express Visual C++( アンマネージドコード ) OpenCV 3.1 |
■257.OpenCV 減算合成 | Prev Top Next | |
|
今回は輪郭抽出した画像と元画像を合成します。
#include <iostream> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #pragma comment( lib, "opencv_world300d.lib" ) int main(int argc, const char* argv[]) { int hr = -1; try { cv::Mat col, gray, lap, lap2, sub; col = cv::imread("D:/TEMP/MaverickProj/Image/OpenCV/19/Texture.png", cv::IMREAD_COLOR); // 輪郭線を白色にするためグレースケールにする gray = cv::imread("D:/TEMP/MaverickProj/Image/OpenCV/19/Texture.png", cv::IMREAD_GRAYSCALE); cv::Laplacian( gray, lap, -1, // 出力画像に求めるビット深度. 3, // 2次微分フィルタを求めるために利用されるアパーチャのサイズ.正の奇数でないとならない 1.0, // 求められたラプラシアンに対するスケールファクタ 0, // dst に格納する前に,結果に足されるオプション値. cv::BORDER_DEFAULT ); // 減算演算するには画像の大きさとチャンネル数を一致させる必要がある。 // グレースケールで読み込むと1チャンネルになるので、cv::mixChannels() を使用して3チャンネルに変換する必要がある。 // cv::mixChannels() を使用する場合 dst の領域をあらかじめ確保しておく必要がある lap2 = cv::Mat(lap.rows, lap.cols, CV_8UC3); // src[0] -> dst[2], src[0] -> dst[1], src[0] -> dst[0] // て感じでコピー元インデックスとコピー先インデックスを指定する int from_to[] = { 0, 2, 0, 1, 0, 0 }; // 3チャンネルに増やす cv::mixChannels(&lap, 1, &lap2, 1, from_to, 3); // 元画像のウィンドウ表示 cv::namedWindow("Source", 1); imshow("Source", col); // 輪郭表示 cv::namedWindow("Laplacian", 1); imshow("Laplacian", lap2); // サイズチェック std::cout << "rows => " << col.rows << ":" << lap2.rows << std::endl; std::cout << "cols => " << col.cols << ":" << lap2.cols << std::endl; // チャンネル数チェック std::cout << "channels => " << col.channels() << ":" << lap2.channels() << std::endl; // 減算合成 sub = col - lap2; cv::namedWindow("subtraction", 1); imshow("subtraction", sub); cv::waitKey(0); hr = 0; } catch (cv::Exception ex) { std::cout << ex.err << std::endl; } // ウィンドウの破棄 cv::destroyAllWindows(); return hr; }
輪郭抽出
減算合成