Visual Studio 2013 Express Visual C++( アンマネージドコード ) OpenCV 3.1 |
■285.OpenCV コーナー検出のための特徴マップの出力 | Prev Top Next | |
|
コーナー検出のための特徴マップを作成します。 cv::preCornerDetect() で作成される特徴点は目立たないため cv::dilate() を使用して特徴点を膨張します。
#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, edge, dst, dst2; // 画像読み込み src = cv::imread("D:/TEMP/MaverickProj/Image/OpenCV/47/Texture.png", cv::IMREAD_GRAYSCALE); cv::namedWindow("src", 1); imshow("src", src); // 画像領域確保 edge = cv::Mat::zeros(src.rows, src.cols, CV_8UC3); // src[0] -> edge[2], src[0] -> edge[1], src[0] -> edge[0] // て感じでコピー元インデックスとコピー先インデックスを指定する int fromTo[] = { 0, 2, 0, 1, 0, 0 }; // シングルチャンネルを3チャンネルに増やして、コピーする cv::mixChannels(&src, 1, &edge, 1, fromTo, 3); // コーナー検出のための特徴マップを出力 cv::preCornerDetect( src, // 8ビットまたは浮動小数点型,シングルチャンネルの入力画像 dst, // CV_32F で src と同じサイズの出力画像 5 // アパーチャサイズ ); // 画像を膨張する cv::dilate(dst, dst2, cv::Mat(), cv::Point(-1, -1), 1); // 検出されたエッジをもとに赤で塗りつぶす for (int i = 0; i < dst2.rows; i++) // 高さ { for (int j = 0; j < dst2.cols; j++) // 幅 { if (dst2.at<cv::Vec<float, 1>>(i, j)[0] > 0.01) { edge.at<cv::Vec3b>(i, j)[2] = 255; } } } cv::namedWindow("edge", 1); cv::imshow("edge", edge); cv::waitKey(0); hr = 0; } catch (cv::Exception ex) { std::cout << ex.err << std::endl; } // ウィンドウの破棄 cv::destroyAllWindows(); return hr; }元画像
特徴点の検出