imgproc模块--轮廓矩
来源:互联网 发布:ubuntu 17.10 安装后 编辑:程序博客网 时间:2024/05/01 22:32
1.目的
(1)使用openCV函数moments计算图像所有的矩
(2)使用openCV函数contoursArea计算轮廓面积
(3)使用openCV函数arcLength计算曲线或者轮廓长度
2.原理
[1]空间矩的计算
[2]中心矩的计算
其中:
[3]归一化的中心矩的计算
在openCV中
// 空间矩 double m00, m10, m01, m20, m11, m02, m30, m21, m12, m03;
// 中心矩 double mu20, mu11, mu02, mu30, mu21, mu12, mu03;
// 中心归一化矩 double nu20, nu11, nu02, nu30, nu21, nu12, nu03;
3.完整代码
(1)CommonInclude.h
#ifndef COMMON_INCLUDE#define COMMON_INCLUDE#include<iostream>#include<opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/imgproc/imgproc.hpp>using namespace std;using namespace cv;#endif
(2)ContoursMoment.cpp
#include "CommonInclude.h"Mat src; Mat src_gray;int thresh = 100;int max_thresh = 255;RNG rng(12345);/** @thresh_callback 函数 */void thresh_callback(int, void* ){ Mat canny_output; vector<vector<Point> > contours; vector<Vec4i> hierarchy; /// 使用Canndy检测边缘 Canny( src_gray, canny_output, thresh, thresh*2, 3 ); /// 找到轮廓 findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) ); /// 计算矩 vector<Moments> mu(contours.size() ); for( int i = 0; i < contours.size(); i++ ) { mu[i] = moments( contours[i], false ); } /// 计算质心: vector<Point2f> mc( contours.size() ); for( int i = 0; i < contours.size(); i++ ) { mc[i] = Point2f( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 ); } /// 绘制轮廓 Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 ); for( int i = 0; i< contours.size(); i++ ) { Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) ); drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() ); circle( drawing, mc[i], 4, color, -1, 8, 0 ); } /// 显示到窗口中 namedWindow( "Contours", CV_WINDOW_AUTOSIZE ); imshow( "Contours", drawing ); /// 通过m00计算轮廓面积并且和OpenCV函数比较 printf("\t Info: Area and Contour Length \n"); for( int i = 0; i< contours.size(); i++ ) { printf(" * Contour[%d] - Area (M_00) = %.2f - Area OpenCV: %.2f - Length: %.2f \n", i, mu[i].m00, contourArea(contours[i]), arcLength( contours[i], true ) ); }}/** @主函数 */int main( int argc, char** argv ){ /// 读入原图像, 返回3通道图像数据 src = imread( argv[1], 1 ); /// 把原图像转化成灰度图像并进行平滑 cvtColor( src, src_gray, CV_BGR2GRAY ); blur( src_gray, src_gray, Size(3,3) ); /// 创建新窗口 char* source_window = "Source"; namedWindow( source_window, CV_WINDOW_AUTOSIZE ); imshow( source_window, src ); createTrackbar( " Canny thresh:", "Source", &thresh, max_thresh, thresh_callback ); thresh_callback( 0, 0 ); waitKey(0); return(0);}
参考文献
1.http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/shapedescriptors/moments/moments.html
阅读全文
0 0
- imgproc模块--轮廓矩
- imgproc模块--轮廓搜索
- opencv c++函数 imgproc模块 23 轮廓矩
- opencv6.5-imgproc图像处理模块之轮廓
- opencv c++函数 imgproc模块 20 在图像中寻找轮廓
- opencv c++函数 imgproc模块 22 创建包围轮廓的矩形和圆形边界框
- OpenCV之imgproc 模块. 图像处理(5)在图像中寻找轮廓 计算物体的凸包 创建包围轮廓的矩形和圆形边界框 为轮廓创建可倾斜的边界框和椭圆 轮廓矩 多边形测试
- OpenCV imgproc模块
- OpenCV imgproc模块(二)
- opencv imgproc模块(三)
- opencv imgproc模块(四)
- imgproc模块/linear filter
- imgproc模块/image pyramids
- imgproc模块--图像金字塔
- imgproc模块--霍夫圆变换
- imgproc模块--直方图
- imgproc模块--直方图比较
- imgproc模块--反向投影
- VS2013快捷键
- mysql explain用法
- VS2013 — 常用快捷键
- 在线云评测系统日志(六):后台评测系统的架构
- ElasticSearch 5.4.1 安装问题及解决办法
- imgproc模块--轮廓矩
- 看完让你彻底搞懂Websocket原理
- Android7.0 PowerManagerService亮灭屏分析(一)
- 分治法求最大连续和
- 零基础搭建Shadowsocks(1) 基础理论
- 深入理解String和intern方法
- CEC 和 ARC
- Eclipse的“order and export”是干什么用的?
- 02. 抓包及保存 ❀ 数据包分析工具 Wireshark