我主要学习了图像矩,就是计算图像中对象的弧长,面积,求出中心点。
主要步骤如下图所示:
原理:
下面是主要用到的API:
moments():计算图像中的中心矩(最高到三阶);
contoursArea():计算对象面积;
arcLength():计算对象轮廓周长或曲线长度;
参考链接:https://blog.csdn.net/keith_bb/article/details/70197104
#include
#include
#include
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> contours;//获取对象轮廓点
vector hierachy;
findContours(canny_out, contours, hierachy, RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
vector ccs(contours.size());//矩的中心点
vector contours_moments(contours.size());
for (size_t i = 0;i < contours.size(); i++)
{
contours_moments[i]=moments(contours[i]);
ccs[i] = Point(static_cast(contours_moments[i].m10 / contours_moments[i].m00), static_cast(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);
}