OpenCv-C++下的影象的矩
阿新 • • 發佈:2018-11-30
我主要學習了影象矩,就是計算影象中物件的弧長,面積,求出中心點。
主要步驟如下圖所示:
原理:
下面是主要用到的API:
moments():計算影象中的中心矩(最高到三階);
contoursArea():計算物件面積;
arcLength():計算物件輪廓周長或曲線長度;
參考連結:https://blog.csdn.net/keith_bb/article/details/70197104
下面貼上程式碼:
#include<opencv2/opencv.hpp> #include<iostream> #include<math.h> using namespace cv; using namespace std; Mat src,dst,gray_src; int threshold_value = 100; int threshold_Max = 255; RNG rng(12345); void demo_Moments(int, void*); int main(int argc, char** argv) { src = imread("D:/test/hot-ball.png"); if (!src.data) { cout << "圖片未找到" << endl; return -1; } cvtColor(src, gray_src, CV_BGR2GRAY); namedWindow("output title",CV_WINDOW_AUTOSIZE); createTrackbar("move", "output title", &threshold_value, threshold_Max, demo_Moments); demo_Moments(0, 0); imshow("input title",src); waitKey(0); return 0; } void demo_Moments(int, void *) { Mat canny_out; Canny(gray_src, canny_out, threshold_value, threshold_value * 2, 3, false); vector<vector<Point>> contours;//獲取物件輪廓點 vector<Vec4i> hierachy; findContours(canny_out, contours, hierachy, RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); vector<Point2f> ccs(contours.size());//矩的中心點 vector<Moments> contours_moments(contours.size()); for (size_t i = 0;i < contours.size(); i++) { contours_moments[i]=moments(contours[i]); ccs[i] = Point(static_cast<float>(contours_moments[i].m10 / contours_moments[i].m00), static_cast<float>(contours_moments[i].m01 / contours_moments[i].m00)); printf("ccs x: %.2f y:%.2f\n", ccs[i].x,ccs[i].y); } Mat outImg; src.copyTo(outImg); for (size_t k = 0; k < contours.size(); k++) { if (contours.size() < 50) { continue;//結束本次迴圈,進入下次迴圈 } Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); drawContours(outImg, contours, int(k), color, 1, 8, hierachy, 0, Point(0, 0)); printf("contours:%d area:%.2f arcLen:%.2f\n", (int)k, contourArea(contours[k]), arcLength(contours[k], true)); circle(outImg, ccs[k], 2, color, 1, 8); } imshow("output title", outImg); }
執行的結果: