OpenCV (C++) 几何形状识别(面积过滤、横纵比过滤等等)

#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++) 几何形状识别(面积过滤、横纵比过滤等等)的更多相关文章
- OpenCV入门系列教学(三)绘制几何形状及添加文本
一.绘制简单的几何形状和添加文本 opencv中绘制图形很简单,我们只需要使用下面这些常用函数即可. #画线 cv2.line() #画圆 cv2.circle() #画矩形 cv. rectangl ...
- OpenCV 和 Dlib 人脸识别基础
00 环境配置 Anaconda 安装 1 下载 https://repo.anaconda.com/archive/ 考虑到兼容性问题,推荐下载Anaconda3-5.2.0版本. 2 安装 3 测 ...
- 2020国防科大综述:3D点云深度学习—综述(点云形状识别部分)
目录 摘要 1.引言: 2.背景 2.1 数据集 2.2评价指标 3.3D形状分类 3.1基于多视图的方法 3.2基于体素的方法 3.3基于点的方法 3.3.1 点对多层感知机方法 3.3.2基于卷积 ...
- OPENCV条形码检测与识别
条形码是当前超市和部分工厂使用比较普遍的物品,产品标识技术,使用摄像头检测一张图片的条形码包含有两个步骤,第一是定位条形码的位置,定位之后剪切出条形码,并且识别出条形码对应的字符串,然后就可以调用网络 ...
- Java基于opencv实现图像数字识别(二)—基本流程
Java基于opencv实现图像数字识别(二)-基本流程 做一个项目之前呢,我们应该有一个总体把握,或者是进度条:来一步步的督促着我们来完成这个项目,在我们正式开始前呢,我们先讨论下流程. 我做的主要 ...
- 【从零学习openCV】IOS7人脸识别实战
前言 接着上篇<IOS7下的人脸检測>,我们顺藤摸瓜的学习怎样在IOS7下用openCV的进行人脸识别,实际上非常easy,因为人脸检測部分已经完毕,剩下的无非调用openCV的方法对採集 ...
- 关于Three.js基本几何形状之SphereGeometry球体学习
一.有关球体SphereGeometry构造函数参数说明 <1>.SphereGeometry(radius, widthSegments, heightSegments, phiStar ...
- iOS10 UI教程视图的几何形状
iOS10 UI教程视图的几何形状 视图属性中的一部分属性可以让定义的视图绘制在屏幕上.在讲解这些属性前,我们首先将讲解,定义视图的几何形状所涉及到的结构类型.这些结构类型如下: CGPoint:它表 ...
- Java基于opencv实现图像数字识别(五)—投影法分割字符
Java基于opencv实现图像数字识别(五)-投影法分割字符 水平投影法 1.水平投影法就是先用一个数组统计出图像每行黑色像素点的个数(二值化的图像): 2.选出一个最优的阀值,根据比这个阀值大或小 ...
随机推荐
- 胡同门牌号-2015决赛Java语言A组第一题
标题:胡同门牌号 小明家住在一条胡同里.胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的.有一天小明突然发现了有趣的事情:如果除去小明家不算,胡同里的其它门牌号加起来,刚好是 ...
- Training little cats(poj3735,矩阵快速幂)
Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10737 Accepted: ...
- Java GC机制详解
垃圾收集 Garbage Collection 通常被称为“GC”,本文详细讲述Java垃圾回收机制. 导读: 1.什么是GC 2.GC常用算法 3.垃圾收集器 4.finalize()方法详解 5. ...
- Android自定义Aop的Gradle Plugin
[上一篇文章]中讲解了如何在Android使用AOP,会发现在Gradle配置aop会比较麻烦,每个module使用了aop都需要配置.接下来看如何简化配置. 1.创建Module 首先,需要建立一个 ...
- [Android]Java中点击事件的四种写法
点击事件的必备条件:实现OnClickListener接口,重写onclick(View v)方法 以拨号简单案例为例,如下图效果: 逻辑流程: 获取点击对象,获取数据 给对象设置监听类 实现OnCl ...
- HDU1083(KB10-C 二分图最大匹配)
Courses Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- Hadoop Mapreduce 参数 (二)
MergeManagerImpl 类 内存参数计算 maxInMemCopyUse 位于构造函数中 final float maxInMemCopyUse = jobConf.getFloat(MRJ ...
- jQuery获取子元素的个数
一.获取div下的子元素的个数 $("div").children().length; 二.获取div下的span子元素的个数 $("div").childre ...
- 跨域cors中如何传递cookie(前端为什么无法向后端传递cookie?)
没有跨域 后端server只要在回应头部‘set-cookie’,那么就会有cookie产生并保存在客户端client. 等到client再次向后端server发送请求时浏览器的机制就会自动携带coo ...
- JS截取字符串方法实例
// JS截取字符串可使用 substring()或者slice() // // 函数:substring() // 定义:substring(start,end)表示从start到end之间的字符串 ...