【OpenCV 】计算物体的凸包/创建包围轮廓的矩形和圆形边界框/createTrackbar添加滑动条/
目录
topic 1:模板匹配
topic 2:图像中寻找轮廓
topic 3:计算物体的凸包
topic 4:轮廓创建可倾斜的边界框和椭圆¶
topic 5:轮廓矩¶
topic 6:为程序界面添加滑动条¶
3.1 目标
3.2 代码实例1
3.3 代码实例2
3.4 实例3运行结果
3.5 运行结果
topic 1:模板匹配
topic 2:图像中寻找轮廓
topic 3:计算物体的凸包
topic 4:轮廓创建可倾斜的边界框和椭圆¶
topic 5:轮廓矩¶
topic 6:为程序界面添加滑动条¶
目录
3.1 目标
使用OpenCV函数 convexHull
3.2 代码实例1
//src = imread("C:\\Users\\guoqi\\Desktop\\ch7\\4.jpg", 1);
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
using namespace std;
Mat src; Mat src_gray;
int thresh = 100;
int max_thresh = 255;
RNG rng(12345);
/// Function header
void thresh_callback(int, void*);
/** @function main */
int main(int argc, char** argv)
{/// 加载源图像src = imread("C:\\Users\\guoqi\\Desktop\\ch7\\15.jpg", 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(" Threshold:", "Source", &thresh, max_thresh, thresh_callback);thresh_callback(0, 0);
waitKey(0);return(0);
}
/** @function thresh_callback */
void thresh_callback(int, void*)
{Mat src_copy = src.clone();Mat threshold_output;vector<vector<Point> > contours;vector<Vec4i> hierarchy;
/// 对图像进行二值化threshold(src_gray, threshold_output, thresh, 255, THRESH_BINARY);
/// 寻找轮廓findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
/// 对每个轮廓计算其凸包vector<vector<Point> >hull(contours.size());for (int i = 0; i < contours.size(); i++){convexHull(Mat(contours[i]), hull[i], false);}
/// 绘出轮廓及其凸包Mat drawing = Mat::zeros(threshold_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, 1, 8, vector<Vec4i>(), 0, Point());drawContours(drawing, hull, i, color, 1, 8, vector<Vec4i>(), 0, Point());}
/// 把结果显示在窗体namedWindow("Hull demo", CV_WINDOW_AUTOSIZE);imshow("Hull demo", drawing);
}
3.3 代码实例2
//src = imread("C:\\Users\\guoqi\\Desktop\\ch7\\4.jpg", 1);
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
using namespace std;
Mat src; Mat src_gray;
int thresh = 100;
int max_thresh = 255;
RNG rng(12345);
/// 函数声明
void thresh_callback(int, void*);
/** @主函数 */
int main(int argc, char** argv)
{/// 载入原图像, 返回3通道图像src = imread("C:\\Users\\guoqi\\Desktop\\ch7\\15.jpg", 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(" Threshold:", "Source", &thresh, max_thresh, thresh_callback);thresh_callback(0, 0);
waitKey(0);return(0);
}
/** @thresh_callback 函数 */
void thresh_callback(int, void*)
{Mat threshold_output;vector<vector<Point> > contours;vector<Vec4i> hierarchy;
/// 使用Threshold检测边缘threshold(src_gray, threshold_output, thresh, 255, THRESH_BINARY);/// 找到轮廓findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
/// 多边形逼近轮廓 + 获取矩形和圆形边界框vector<vector<Point> > contours_poly(contours.size());vector<Rect> boundRect(contours.size());vector<Point2f>center(contours.size());vector<float>radius(contours.size());
for (int i = 0; i < contours.size(); i++){approxPolyDP(Mat(contours[i]), contours_poly[i], 3, true);boundRect[i] = boundingRect(Mat(contours_poly[i]));minEnclosingCircle(contours_poly[i], center[i], radius[i]);}
/// 画多边形轮廓 + 包围的矩形框 + 圆形框Mat drawing = Mat::zeros(threshold_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_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point());rectangle(drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0);circle(drawing, center[i], (int)radius[i], color, 2, 8, 0);}
/// 显示在一个窗口namedWindow("Contours", CV_WINDOW_AUTOSIZE);imshow("Contours", drawing);
}
3.4 实例3运行结果
//src = imread("C:\\Users\\guoqi\\Desktop\\ch7\\4.jpg", 1);#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>using namespace cv;
using namespace std;Mat src; Mat src_gray;
int thresh = 100;
int max_thresh = 255;
RNG rng(12345);/// 函数声明
void thresh_callback(int, void*);/** @主函数 */
int main(int argc, char** argv)
{/// 读入原图像, 返回3通道图像数据src = imread("C:\\Users\\guoqi\\Desktop\\ch7\\15.jpg", 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);
}/** @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));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);}
}
3.5 运行结果
实例1运行结果
实例2运行结果
实例3运行结果
【OpenCV 】计算物体的凸包/创建包围轮廓的矩形和圆形边界框/createTrackbar添加滑动条/相关推荐
- OpenCV之imgproc 模块. 图像处理(5)在图像中寻找轮廓 计算物体的凸包 创建包围轮廓的矩形和圆形边界框 为轮廓创建可倾斜的边界框和椭圆 轮廓矩 多边形测试
在图像中寻找轮廓 目标 在这个教程中你将学到如何: 使用OpenCV函数 findContours 使用OpenCV函数 drawContours 原理 例程 教程的代码在下面给出. 你也可以从 这里 ...
- OpenCV 计算物体的凸包
使用OpenCV函数 convexHull 步骤 滤波--消除噪声 增强--二值化,使轮廓更明显 检测--选出边缘点 计算凸包 例程 #include "opencv2/highgui/hi ...
- 【学习OpenCV】给轮廓画出矩形和圆形边界
OpenCV支持大量的轮廓.边缘.边界的相关函数,相应的函数有moments.HuMoments.findContours.drawContours.approxPolyDP.arcLength.bo ...
- 给轮廓画出矩形和圆形边界
OpenCV支持大量的轮廓.边缘.边界的相关函数,相应的函数有moments.HuMoments.findContours.drawContours.approxPolyDP.arcLength.bo ...
- OpenCV之highgui 模块. 高层GUI和媒体I/O: 为程序界面添加滑动条 OpenCV的视频输入和相似度测量 用OpenCV创建视频
为程序界面添加滑动条 在以前的教程中 (例如 linear blending 和 brightness and contrast adjustments)你有可能注意到需要 input 一些数值到我们 ...
- OpenCV学习笔记:反色显示图片、鼠标事件、键盘事件和窗口滑动条操作
环境CentOS7 g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) $ pkg-config --modversion opencv 2.4.13 参照< ...
- opencv计算物体姿态旋转_OpenCV轮廓检测,计算物体旋转角度
效果还是有点问题的,希望大家共同探讨一下 // FindRotation-angle.cpp : 定义控制台应用程序的入口点. // // findContours.cpp : 定义控制台应用程序的入 ...
- opencv计算物体姿态旋转_物体的三维识别与6D位姿估计:PPF系列论文介绍(五)...
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文创新点: 点对特征是一种广泛应用的检测点云中三维物体的方法,但在存在传感器噪声和背景杂波的情况下, ...
- OpenCV计算物体的重心坐标(2值图像)
效果图: 代码: // FindGravity.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <iostream&g ...
最新文章
- 2009年国内十强开源CMS排行榜[转]
- QT的QBufferDataGenerator类的使用
- linux svn apt get,Ubuntu下安装SVN客户端
- Tableau研学小课堂(part3)--Tableau数据可视化
- [Tyvj1114 搭建双塔]
- JBoss Data Virtualization 6.1 Beta现在可用
- 小红旗图标在excel如何输入_excel数据核对技巧:如何用函数公式标识输入正误...
- python os详解
- 云计算的思想领袖:与橡树岭国家实验室云计算研究员Rob Gillen的谈话
- 项目实例:模十状态机与7段译码器显示系统,Quartus环境(文末附程序,百度文库里的)
- mysql里查询中文条件_Mysql对中文查询条件出现的问题
- 长江大学计算机基础试卷2018 2019,长江大学2017年第一学期-计算机基础试卷.doc
- 软件著作权个人申请全套攻略
- 签名档php,签名档文字
- 双系统(win10Ubuntu16.04)开机引导设置
- 【FastAPI 学习十二】定时任务篇 (移步博客园或个人网站 无广告,界面清爽整洁)
- (fym)ssm基于web的教务管理系统 毕业设计261620
- 计算机二级试题word,计算机二级考试word试题及答案.doc
- 景深概念以及景深的计算公式
- CSS 样式继承 inherit 属性
热门文章
- c语言cythe头文件,第5章 C语言序的基本结构.doc
- Mapbox HTML可视化点,线,多线,面带底图
- C:内存中供用户使用的存储空间
- 随笔:计算机编程中的一些术语
- 【机器学习入门】(5) 决策树算法实战:sklearn实现决策树,实例应用(沉船幸存者预测)附python完整代码及数据集
- ubuntu安装OpenCV详细教程(建议收藏)
- android 轮播 中间变大,如何实现中间大两头小的轮播效果
- 基于C++的二叉树的入门讲解
- CSS自定义鼠标样式。JS获取鼠标坐标,实现提示气泡框跟随鼠标移动
- UE中的自动化学习课程