目录

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添加滑动条/相关推荐

  1. OpenCV之imgproc 模块. 图像处理(5)在图像中寻找轮廓 计算物体的凸包 创建包围轮廓的矩形和圆形边界框 为轮廓创建可倾斜的边界框和椭圆 轮廓矩 多边形测试

    在图像中寻找轮廓 目标 在这个教程中你将学到如何: 使用OpenCV函数 findContours 使用OpenCV函数 drawContours 原理 例程 教程的代码在下面给出. 你也可以从 这里 ...

  2. OpenCV 计算物体的凸包

    使用OpenCV函数 convexHull 步骤 滤波--消除噪声 增强--二值化,使轮廓更明显 检测--选出边缘点 计算凸包 例程 #include "opencv2/highgui/hi ...

  3. 【学习OpenCV】给轮廓画出矩形和圆形边界

    OpenCV支持大量的轮廓.边缘.边界的相关函数,相应的函数有moments.HuMoments.findContours.drawContours.approxPolyDP.arcLength.bo ...

  4. 给轮廓画出矩形和圆形边界

    OpenCV支持大量的轮廓.边缘.边界的相关函数,相应的函数有moments.HuMoments.findContours.drawContours.approxPolyDP.arcLength.bo ...

  5. OpenCV之highgui 模块. 高层GUI和媒体I/O: 为程序界面添加滑动条 OpenCV的视频输入和相似度测量 用OpenCV创建视频

    为程序界面添加滑动条 在以前的教程中 (例如 linear blending 和 brightness and contrast adjustments)你有可能注意到需要 input 一些数值到我们 ...

  6. OpenCV学习笔记:反色显示图片、鼠标事件、键盘事件和窗口滑动条操作

    环境CentOS7 g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) $ pkg-config --modversion opencv 2.4.13 参照< ...

  7. opencv计算物体姿态旋转_OpenCV轮廓检测,计算物体旋转角度

    效果还是有点问题的,希望大家共同探讨一下 // FindRotation-angle.cpp : 定义控制台应用程序的入口点. // // findContours.cpp : 定义控制台应用程序的入 ...

  8. opencv计算物体姿态旋转_物体的三维识别与6D位姿估计:PPF系列论文介绍(五)...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文创新点: 点对特征是一种广泛应用的检测点云中三维物体的方法,但在存在传感器噪声和背景杂波的情况下, ...

  9. OpenCV计算物体的重心坐标(2值图像)

    效果图: 代码: // FindGravity.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <iostream&g ...

最新文章

  1. 2009年国内十强开源CMS排行榜[转]
  2. QT的QBufferDataGenerator类的使用
  3. linux svn apt get,Ubuntu下安装SVN客户端
  4. Tableau研学小课堂(part3)--Tableau数据可视化
  5. [Tyvj1114 搭建双塔]
  6. JBoss Data Virtualization 6.1 Beta现在可用
  7. 小红旗图标在excel如何输入_excel数据核对技巧:如何用函数公式标识输入正误...
  8. python os详解
  9. 云计算的思想领袖:与橡树岭国家实验室云计算研究员Rob Gillen的谈话
  10. 项目实例:模十状态机与7段译码器显示系统,Quartus环境(文末附程序,百度文库里的)
  11. mysql里查询中文条件_Mysql对中文查询条件出现的问题
  12. 长江大学计算机基础试卷2018 2019,长江大学2017年第一学期-计算机基础试卷.doc
  13. 软件著作权个人申请全套攻略
  14. 签名档php,签名档文字
  15. 双系统(win10Ubuntu16.04)开机引导设置
  16. 【FastAPI 学习十二】定时任务篇 (移步博客园或个人网站 无广告,界面清爽整洁)
  17. (fym)ssm基于web的教务管理系统 毕业设计261620
  18. 计算机二级试题word,计算机二级考试word试题及答案.doc
  19. 景深概念以及景深的计算公式
  20. CSS 样式继承 inherit 属性

热门文章

  1. c语言cythe头文件,第5章 C语言序的基本结构.doc
  2. Mapbox HTML可视化点,线,多线,面带底图
  3. C:内存中供用户使用的存储空间
  4. 随笔:计算机编程中的一些术语
  5. 【机器学习入门】(5) 决策树算法实战:sklearn实现决策树,实例应用(沉船幸存者预测)附python完整代码及数据集
  6. ubuntu安装OpenCV详细教程(建议收藏)
  7. android 轮播 中间变大,如何实现中间大两头小的轮播效果
  8. 基于C++的二叉树的入门讲解
  9. CSS自定义鼠标样式。JS获取鼠标坐标,实现提示气泡框跟随鼠标移动
  10. UE中的自动化学习课程