1,计算轮廓的矩moments()&面积contourArea()
实例1,(从而求面积,长度)
待,对比参考书中程序发现错误
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
#define Windows_name1"【原始图】"
#define Window_name2"【图像轮廓】"
static void on_ThreshChange(int, void*);
//全局变量申明
Mat g_srcimg, g_GRAYIMG;
int g_nThresh = 100;
int g_nMaxThresh = 255;
RNG g_rng(12345);
Mat g_cannyMat_output;
vector<vector<Point>>g_vcontours;
vector<Vec4i>g_vHierarchy;
//主函数
int main(int argc, char**argv)
{
g_srcimg=imread( "D://1.jpg,1" );
cvtColor(g_srcimg, g_GRAYIMG, COLOR_BGR2GRAY);
blur(g_GRAYIMG, g_GRAYIMG, Size(3, 3));
namedWindow(Windows_name1, WINDOW_AUTOSIZE);
imshow(Windows_name1, g_srcimg);
//创建滚动条并初始化
createTrackbar("阈值", Windows_name1, &g_nThresh, g_nMaxThresh, on_ThreshChange);
on_ThreshChange(0, 0);
waitKey(0);
return 0;
}
void on_ThreshChange(int, void*)
{
//使用canny边缘检测
Canny(g_GRAYIMG, g_cannyMat_output, g_nThresh, g_nThresh * 2, 3);
//找轮廓
findContours(g_cannyMat_output, g_vcontours, g_vHierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
//计算矩
vector<Moments>mu(g_vcontours.size());
for (unsigned int i = 0; i < g_vcontours.size(); i++)
{
mu[i]=moments(g_vcontours[i],false);
}
//计算中心矩
vector<Point2f>mc(g_vcontours.size());
for (unsigned int i = 0; i < g_vcontours.size(); i++)
{
mc[i] = Point2f(static_cast<float>(mu[i].m10 / mu[i].m00), static_cast<float>(mu[i].m01 / mu[i].m00));
}
//绘制轮廓
Mat drawing = Mat::zeros(g_cannyMat_output.size(), CV_8UC3);
for (unsigned int i = 0; i < g_vcontours.size(); i++)
{
Scalar color = Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255));//随机生成颜色值
drawContours(drawing, g_vcontours, i, color, 2, 8, g_vHierarchy, 0, Point());
circle(drawing, mc[i], 4, color, -1, 8,