#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. python基础技巧综合训练题2

    1,判断一个字符串中的每一个字母是否都在另一个字符串中,可以利用集合的特性来解,集合的元素如果存在,再次更新(update) 是添加不进集合的,那么集合的长度还是跟原来一样,如果添加进去,集合长度就会 ...

  2. 排序算法(10)--Distribution Sorting--分布排序[2]--Radix Sort--基数排序

    1.基本思想 基数排序是通过“分配”和“收集”过程来实现排序 2.实现原理 基数排序(以整形为例),将整形10进制按每位拆分,然后从低位到高位依次比较各个位.主要分为两个过程: (1)分配,先从个位开 ...

  3. js-ES6学习笔记-module(3)

    1.如果想设置跨模块的常量(即跨多个文件),或者说一个值要被多个模块共享,可以采用下面的写法. // constants.js 模块 export const A = 1; export const ...

  4. VS2017写代码时几个常用的快捷键

    说明:组合键是同时按,非组合键是按住Ctrl依次按后面的键1.格式化  格式化全部代码       Ctrl+A+K+F  格式化选中的代码     Ctrl+K+F 2.注释代码  注释代码    ...

  5. ActiveReports 报表应用教程 (10)---交互式报表之向下钻取(详细数据按需显示解决方案)

    在葡萄城ActiveReports报表中可以动态的显示或者隐藏某区域的数据,通过该功能用户可以根据需要显示或者隐藏所关心的数据,结合数据排序.过滤等功能可以让用户更方便地分析报表数据. 本文中展示的是 ...

  6. jQuery事件和JSON点语法

    <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" ...

  7. php用smarty来做简易留言系统,明细步骤简单操作

    留言信息是之前用php做过的一个例子,现在把它用smarty模板来做 大概是这样子 点击发布信息 然后填写内容,发送后会返回表格,写的内容都会出现在表格里 数据库的数据是这样的: 先建两个文件.php ...

  8. 语义SLAM的数据关联和语义定位(一)

    语义SLAM和多传感器融合是自动驾驶建图和定位部分比较热门的两种技术.语义SLAM中,语义信息的数据关联相较于特征点的数据关联有所不同.我们一般用特征描述子的相似性来匹配和关联不同图像中的特征点.特征 ...

  9. Android4.4中jni的native的方法无法找到的解决方案

    1.禁用代码混淆功能 LOCAL_PROGUARD_ENABLED:= disabled 2.修改混淆规则,对于类的native 方法 不要进行混淆

  10. springcloud 入门 2 (Enreka的服务和注册)

    spring cloud eureka: eureka 用以服务发现.服务注册,比较流行的有consul(后面再介绍) eureka介绍: eureka为netflix开源软件,分为三个部分: eur ...