【opencv练习36 - 图像moment】
2016-09-14 21:48
176 查看
/******************************************************************* 测试程序【目标面积】 时间:2016年9月3日 ********************************************************************/ Mat src; Mat src_gray; int thresh = 100; int max_thresh = 255; RNG rng(12345); void thresh_callback(int, void* ); int main(void) { src = imread("moments.jpg", 1 ); cvtColor( src, src_gray, COLOR_BGR2GRAY ); blur( src_gray, src_gray, Size(3,3) ); const char* source_window = "Source"; namedWindow( source_window, WINDOW_AUTOSIZE ); imshow( source_window, src ); createTrackbar( " Canny thresh:", "Source", &thresh, max_thresh, thresh_callback ); thresh_callback( 0, 0 ); waitKey(0); return(0); } void thresh_callback(int, void* ) { Mat canny_output; vector<vector<Point> > contours; vector<Vec4i> hierarchy; // 【1、Canny边缘检测 + 查找轮廓 src_gray——>canny_output——>contours】 Canny( src_gray, canny_output, thresh, thresh*2, 3 ); findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) ); // 【2、获取moments(moments向量) contours——> moments(mu) ——>Point2f(nc)】 vector<Moments> mu(contours.size() ); for( size_t i = 0; i < contours.size(); i++ ) { mu[i] = moments( contours[i], false ); } //【Get重心】 vector<Point2f> mc( contours.size() ); for( size_t i = 0; i < contours.size(); i++ ) { mc[i] = Point2f( static_cast<float>(mu[i].m10/mu[i].m00) , static_cast<float>(mu[i].m01/mu[i].m00) ); } //【3、绘制轮廓】 Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 ); for( size_t i = 0; i< contours.size(); i++ ) { Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) ); drawContours( drawing, contours, (int)i, color, 2, 8, hierarchy, 0, Point() ); circle( drawing, mc[i], 4, color, -1, 8, 0 ); } // Show namedWindow( "Contours", WINDOW_AUTOSIZE ); imshow( "Contours", drawing ); //【计算面积,和Opencv的面积函数比较】 printf("Info: Area and Contour Length \n"); for( size_t i = 0; i< contours.size(); i++ ) { printf(" * Contour[%d] - Area (M_00) = %.2f \n", (int)i,mu[i].m00);//m00 面积 printf(" * Contour[%d] - Area OpenCV: %.2f - Length: %.2f \n", (int)i, contourArea(contours[i]),arcLength( contours[i], true ) ); //长度 Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) ); drawContours( drawing, contours, (int)i, color, 2, 8, hierarchy, 0, Point() ); //绘制轮廓 circle( drawing, mc[i], 4, color, -1, 8, 0 ); //绘制圆心 } }
相关文章推荐
- 【opencv代码练习6】图像模糊
- opencv图像处理——形态学腐蚀膨胀练习示例代码
- Opencv图像识别从零到精通(36)----DFT离散傅里叶变换
- 【opencv练习14 - 模糊图像 】
- 【opencv练习19 - 图像添加边界】
- 【opencv练习06-Scan图像の三种方法】
- python-opencv图像处理基础练习1
- python深度学习库pytorch::transforms练习:opencv,scikit-image,PIL图像处理库比较
- 【opencv代码练习4】图像显示
- 【opencv代码练习5】图像腐蚀
- python-opencv图像处理基础练习2
- 【opencv练习08 - 改变图像亮度】
- opencv练习:将两幅同样大小的图像想减并显示结果
- opencv学习笔记(十一)——图像腐蚀和膨胀混合运用练习
- OpenCV图像处理--为图像添加Logo
- Python下opencv使用笔记(四)(图像的阈值处理)
- OpenCV 学习记录2 图像简单处理及调用摄像头
- Android-图像识别项目OpenCV(4):开发思路以及问题
- [OpenCV]图像的载入、显示、输出
- opencv关于图像处理坐标的问题