OpenCV >> C/C++
shape distance
參考資訊:
1. examples
2. computeDistance
prototype
virtual float cv::ShapeDistanceExtractor::computeDistance( InputArray contour1, InputArray contour2);
main.cpp
#include <opencv2/shape.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/core/utility.hpp> #include <iostream> #include <string> using namespace std; using namespace cv; static vector<Point> simpleContour(const Mat& currentQuery, int n=300) { vector<vector<Point>> _contoursQuery; vector <Point> contoursQuery; findContours(currentQuery, _contoursQuery, RETR_LIST, CHAIN_APPROX_NONE); for(size_t border=0; border<_contoursQuery.size(); border++){ for(size_t p=0; p<_contoursQuery[border].size(); p++){ contoursQuery.push_back(_contoursQuery[border][p]); } } int dummy=0; for(int add=(int)contoursQuery.size()-1; add<n; add++){ contoursQuery.push_back(contoursQuery[dummy++]); } cv::randShuffle(contoursQuery); vector<Point> cont; for(int i=0; i<n; i++){ cont.push_back(contoursQuery[i]); } return cont; } int main(int argc, char** argv) { Size size(300, 300); Mat src=imread("1.jpg", IMREAD_GRAYSCALE); Mat srcToShow; resize(src, srcToShow, size, 0, 0, INTER_LINEAR_EXACT); imshow("src", srcToShow); moveWindow("src", 0, 300); vector<Point> csrc = simpleContour(src); if(src.empty()){ printf("failed to load 1.jpg\n"); return -1; } Mat dst=imread("2.jpg", IMREAD_GRAYSCALE); Mat dstToShow; resize(dst, dstToShow, size, 0, 0, INTER_LINEAR_EXACT); imshow("dst", dstToShow); moveWindow("dst", 305, 300); vector<Point> cdst = simpleContour(dst); if(dst.empty()){ printf("failed to load 2.jpg\n"); return -1; } cv::Ptr <cv::ShapeContextDistanceExtractor> mysc = cv::createShapeContextDistanceExtractor(); float dis = mysc->computeDistance(csrc, cdst); printf("distance: %f\n", dis); waitKey(); destroyWindow("src"); destroyWindow("dst"); return 0; }
CMakeLists.txt
cmake_minimum_required(VERSION 2.8) project(main) find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) add_executable(main main.cpp) target_link_libraries(main ${OpenCV_LIBS})
編譯並且執行
$ cmake . $ make $ ./main
完成
distance: 0.139355