#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. Netty接收到一个请求但是代码段执行了两次

    这是因为HttpRequestDecoder把请求拆分成HttpRequest和HttpContent两部分, 所以在建立连接的时候建立了两次.

  2. POJ1284(SummerTrainingDay04-K 原根)

    Primitive Roots Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4505   Accepted: 2652 D ...

  3. cf19E. Fairy(奇环 二分图染色)

    题意 题目链接 Sol 非常有思维含量的一道题,队爷的论文里介绍了一种\(N \sqrt{N}\)的暴力然鹅看不懂.. 看了一下clj的\(O(nlogn)\)的题解,又翻了翻题交记录,发现\(O(n ...

  4. 令人血脉喷张的animate.css

    都说html5.css3是大局是潮流,尽管css3也不难,学起来比较简单,但我还是喜欢他的轻量级集大成者的animate.css框架,初学的小伙伴们加油啦 下面我分析一下animate.css框架里面 ...

  5. js 四种调用模式和this的关系总结

    更新: 这篇又简单又明了啊喂 首先看这一篇, 很简单很清楚了,http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascri ...

  6. OSGI企业应用开发(十二)OSGI Web应用开发(一)

    前面文章中介绍了如何在OSGI应用中整合Spring和Mybatis框架,本篇文章开始介绍如何使用OSGI技术开发Web应用.对于传统的Java EE应用,应用中涉及到的Web元素无非就是Servle ...

  7. ArcGIS三种方式打断相交线------Feature To Line工具

    有多个layer图层相交线时,选用”Feature To Line“工具,将多个图层相交线打断,然后合并成一个图层. (1)       选择工具栏”Geoprocessing“中的”ArcToolb ...

  8. php 实现简单购物车功能(2)

    上一篇的时候只是写了简单的加入购物车功能,购物车中产品的删除.提交订单后,库存的减少 以及客户账户的余额都没有完善, 这一篇是接着完善上一篇的,上一篇写到了购物车中删除的功能了,为了使删除的代码少敲一 ...

  9. Hibernate中对象的三种状态及相互转化

    1. 瞬时状态 (Transient) 当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下:  Customer customer=new Customer(“ ...

  10. jquery中使用datepicker限制开始日期小于结束日期

    这里是使用Jquery插件实现的,这段代码来自于网络.感觉很实用,就做笔记记录下来. 原文:http://blog.csdn.net/tianyacao8025/article/details/707 ...