Visual Studio 2013 Express Visual C++( アンマネージドコード ) OpenCV 3.1 |
■280.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, corners, dst; // 画像読み込み src = cv::imread("D:/TEMP/MaverickProj/Image/OpenCV/42/Texture.png", cv::IMREAD_GRAYSCALE); cv::namedWindow("src", 1); imshow("src", src); dst = cv::Mat::zeros(src.rows, src.cols, CV_8UC3); // src[0] -> dst[2], src[0] -> dst[1], src[0] -> dst[0] // て感じでコピー元インデックスとコピー先インデックスを指定する int fromTo[] = { 0, 2, 0, 1, 0, 0 }; // シングルチャンネルを3チャンネルに増やして、コピーする cv::mixChannels( &src, 1, &dst, 1, fromTo, 3 ); int blockSize = 3; // コーナーを検出するために,勾配行列の最小の固有値を求める cv::cornerMinEigenVal( src, // 8ビットまたは浮動小数点型,シングルチャンネルの入力画像 corners, // 最小固有値が格納される画像.型は CV_32FC1 で, src と同じサイズ blockSize // 近傍領域のサイズ ); for (int i = 0; i < corners.rows; i++) // 高さ { for (int j = 0; j < corners.cols; j++) // 幅 { // ピクセルデータの検出 float p = corners.at<cv::Vec<float, 1>>(i, j)[0]; // 特徴点かどうかを適当に判定 if (p > 0.01f) { // 特徴点の強さによって半径の大きさを変えて、円を描画する cv::circle(dst, cv::Point(j, i), 50.0f * p + 1, cv::Scalar(0, 0, 255), 1); } } } cv::namedWindow("dst", 1); imshow("dst", dst); cv::waitKey(0); hr = 0; } catch (cv::Exception ex) { std::cout << ex.err << std::endl; } // ウィンドウの破棄 cv::destroyAllWindows(); return hr; }元画像
特徴点の強さ