#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h> using namespace cv;
using namespace std; int main(int argc, char** argv)
{
Mat src = imread("3 input.bmp", IMREAD_GRAYSCALE);
Mat binary, dst = Mat::zeros(src.size(), CV_8UC3);
Mat Triangle = dst.clone(), Rect1 = dst.clone(), BigCircle = dst.clone(), SmallCircle = dst.clone(); if (src.empty()) {
printf("Could not load image...");
return -;
}
src = ~src;//取反
imshow("原图", src);
//二值化
threshold(src, binary, , , THRESH_BINARY | THRESH_OTSU); //发现轮廓
vector<vector<Point>> contours;
vector<Vec4i> hireachy;
findContours(binary, contours, hireachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point()); //面积删选
for (size_t t = ; t < contours.size(); t++)
{
double area = contourArea(contours[t]);
if (area < ) continue;//将面积小于40000的去掉
drawContours(Triangle, contours, t, Scalar(, , ), , , Mat(), , Point());
} for (size_t t = ; t < contours.size(); t++)
{
double area = contourArea(contours[t]);
if (area > || area<) continue;//将面积小于40000的去掉
drawContours(BigCircle, contours, t, Scalar(, , ), , , Mat(), , Point());
} for (size_t t = ; t < contours.size(); t++)
{
double area = contourArea(contours[t]);
if (area > || area<) continue;//将面积小于40000的去掉
drawContours(Rect, contours, t, Scalar(, , ), , , Mat(), , Point());
} for (size_t t = ; t < contours.size(); t++)
{
double area = contourArea(contours[t]);
if (area > ) continue;//将面积小于40000的去掉
//其他过滤方法 /*//横纵比过滤
Rect rect= boundingRect(contours[t]);//返回最小外接矩形
float ratio = float(rect.width) / float(rect.height);//计算横纵比
if (ratio<1.1&&ratio>0.9) {} //周长过滤
float length = arcLength(contours[t], true);//计算轮廓长度 */ drawContours(SmallCircle, contours, t, Scalar(, , ), , , Mat(), , Point());
}
imshow("Triangle", Triangle);
imshow("BigCircle", BigCircle);
imshow("Rect", Rect1);
imshow("SmallCircle", SmallCircle); waitKey();
return ;
}

方法二:多边形逼近:

void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed);

参数说明:

InputArray curve:输入的点集
OutputArray approxCurve:输出的点集,当前点集是能最小包容指定点集的。draw出来即是一个多边形;
double epsilon:指定的精度,也即是原始曲线与近似曲线之间的最大距离。
bool closed:若为true,则说明近似曲线是闭合的,它的首位都是相连,反之,若为false,则断开。

 #include <opencv2/opencv.hpp>
#include <iostream> #define MATCHMETHOD TM_SQDIFF_NORMED//宏定义匹配模式
using namespace cv;
using namespace std; int main(int argc, char** argv)
{
Mat src = imread("F:/2019视觉培训内容/2019视觉培训内容/3 input.bmp");
Mat src_gray,binary ;
Mat Triangle = src.clone(), Rect = src.clone(), BigCircle = src.clone(), SmallCircle = src.clone();
if (src.empty()) {
printf("Could not load image...");
return -;
}
imshow("Input Image",src); //二值化
cvtColor(src, src_gray, COLOR_BGR2GRAY);
threshold(src_gray, binary, , , THRESH_BINARY | THRESH_OTSU);
binary = ~binary;
imshow("binary", binary); //发现轮廓
vector<vector<Point>> contours;
vector<Point> point;
vector<Vec4i> hireachy;
findContours(binary, contours, hireachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point()); //绘制出所有轮廓
for (size_t t = ; t < contours.size(); t++)
{ int epsilon = 0.01*arcLength(contours[t], true);
approxPolyDP(contours[t], point, epsilon, true);
if(point.size()==)
{
drawContours(Triangle, contours, t, Scalar(, , ), , , Mat(), , Point());//dst必须先初始化
}
else if (point.size() == )
{
drawContours(Rect, contours, t, Scalar(, , ), , , Mat(), , Point());//dst必须先初始化
} else
{
double area = contourArea(contours[t]);
if (area < )
{
drawContours(SmallCircle, contours, t, Scalar(, , ), , , Mat(), , Point());//dst必须先初始化
}
else
{
drawContours(BigCircle, contours, t, Scalar(, , ), , , Mat(), , Point());//dst必须先初始化
}
} cout << "边的数目:" << point.size() << endl;
} imshow("Triangle", Triangle);
imshow("BigCircle", BigCircle);
imshow("Rect", Rect);
imshow("SmallCircle", SmallCircle); waitKey(); return ;
}

OpenCV (C++) 几何形状识别(面积过滤、横纵比过滤等等)的更多相关文章

  1. OpenCV入门系列教学(三)绘制几何形状及添加文本

    一.绘制简单的几何形状和添加文本 opencv中绘制图形很简单,我们只需要使用下面这些常用函数即可. #画线 cv2.line() #画圆 cv2.circle() #画矩形 cv. rectangl ...

  2. OpenCV 和 Dlib 人脸识别基础

    00 环境配置 Anaconda 安装 1 下载 https://repo.anaconda.com/archive/ 考虑到兼容性问题,推荐下载Anaconda3-5.2.0版本. 2 安装 3 测 ...

  3. 2020国防科大综述:3D点云深度学习—综述(点云形状识别部分)

    目录 摘要 1.引言: 2.背景 2.1 数据集 2.2评价指标 3.3D形状分类 3.1基于多视图的方法 3.2基于体素的方法 3.3基于点的方法 3.3.1 点对多层感知机方法 3.3.2基于卷积 ...

  4. OPENCV条形码检测与识别

    条形码是当前超市和部分工厂使用比较普遍的物品,产品标识技术,使用摄像头检测一张图片的条形码包含有两个步骤,第一是定位条形码的位置,定位之后剪切出条形码,并且识别出条形码对应的字符串,然后就可以调用网络 ...

  5. Java基于opencv实现图像数字识别(二)—基本流程

    Java基于opencv实现图像数字识别(二)-基本流程 做一个项目之前呢,我们应该有一个总体把握,或者是进度条:来一步步的督促着我们来完成这个项目,在我们正式开始前呢,我们先讨论下流程. 我做的主要 ...

  6. 【从零学习openCV】IOS7人脸识别实战

    前言 接着上篇<IOS7下的人脸检測>,我们顺藤摸瓜的学习怎样在IOS7下用openCV的进行人脸识别,实际上非常easy,因为人脸检測部分已经完毕,剩下的无非调用openCV的方法对採集 ...

  7. 关于Three.js基本几何形状之SphereGeometry球体学习

    一.有关球体SphereGeometry构造函数参数说明 <1>.SphereGeometry(radius, widthSegments, heightSegments, phiStar ...

  8. iOS10 UI教程视图的几何形状

    iOS10 UI教程视图的几何形状 视图属性中的一部分属性可以让定义的视图绘制在屏幕上.在讲解这些属性前,我们首先将讲解,定义视图的几何形状所涉及到的结构类型.这些结构类型如下: CGPoint:它表 ...

  9. Java基于opencv实现图像数字识别(五)—投影法分割字符

    Java基于opencv实现图像数字识别(五)-投影法分割字符 水平投影法 1.水平投影法就是先用一个数组统计出图像每行黑色像素点的个数(二值化的图像): 2.选出一个最优的阀值,根据比这个阀值大或小 ...

随机推荐

  1. mysql时间与字符串之间相互转换

    1.时间转字符串 DATE_FORMAT(日期,格式字符串) SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); 2.字符串转时间 STR_TO_DATE( ...

  2. 单元测试(一)-NUnit基础

    单元测试作为提高代码和软件质量的有效途径,其重要性和益处自不必多说,虽然我没有实践过TDD之类,但坚信单元测试的积极作用.作为一种开发方法,单元测试早在上世纪70年代就已经在Smalltalk语言被运 ...

  3. Android Studio 使用AChartEngine制作饼图

    前言: 在很多项目中都会使用到图表,具体表现形式为饼图.折线图.柱状图等,但是网上有很多图表架包都是需要收费的,而Google的AChartEngine是免费的,于是AChartEngine就变成了首 ...

  4. OpenCV 图片美化

    1.彩色直方图 def ImgHist(image,type): color = (255,255,255) windowName='gray' if type==31: color=(255,0,0 ...

  5. CSS| text文本属性

    注意:一般来说,可以为所有块级元素应用 text-indent,但无法将该属性应用于行内元素,图像之类的替换元素上也无法应用 text-indent 1)  text-indent 取值: 5px/2 ...

  6. 500.19 ,错误:4.00x80070005

    直接把网站根目录添加上everyone权限即可

  7. [Python_4] Python 面向对象(OOP)

    0. 说明 Python 面向对象(OOP) 笔记.迭代磁盘文件.析构函数.内置方法.多重继承.异常处理 参考 Python面向对象 1. 面向对象 # -*-coding:utf-8-*- &quo ...

  8. 35_张孝祥Java高新技术_为注解增加各种属性

    注解的作用之所以那么强大,就是因为它有属性 注解很像接口,属性很像方法.   什么是注解的属性 一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是传智播客的学生,否则,就不是.如果还想区分出事传智播客 ...

  9. 乘风破浪:LeetCode真题_041_First Missing Positive

    乘风破浪:LeetCode真题_041_First Missing Positive 一.前言 这次的题目之所以说是难,其实还是在于对于某些空间和时间的限制. 二.First Missing Posi ...

  10. python: 用pygments给markdown文档染色

    首先你需要一个markdown解析器 比如有常见的markdown和markdown2,其他的可以参考这个网站的评价 我选择了mistune,自己继承写一个渲染的Renderer mistune的do ...