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.选出一个最优的阀值,根据比这个阀值大或小 ...
随机推荐
- mongodb命令(持续更新)
$lt $lte $gt $gte< . <= . > . >= 1.分组求和db.collection.aggregate([{$group : {_id : null, s ...
- 在Windows上搭建kafka环境
英文文档:https://dzone.com/articles/running-apache-kafka-on-windows-os 第一步:安装JDK 百度很多,不赘述 第二步:安装ZooKeepe ...
- JS 的map和array集合组合返回JSON字符串
使用map 和array 返回自定义对象的JSON字符串: function getObjectJSON() { var array = new Array(); for (var i = 0; i ...
- canvas与svg特性和使用对比
什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以 ...
- 【代码笔记】iOS-collectionView实现照片删除
一,效果图. 二,工程图. 三,代码. ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIVie ...
- Redis Linux版安装详解
Redis介绍 我的Linux系统是CentOS7 1.安装Redis 官方下载地址:http://download.redis.io 使用Linux下载:wget http://download.r ...
- 微信小程序< 2 > ~ 微信小程序之头条新闻
简介 上一篇文章,主要是介绍下微信小程序的开发环境安装和微信组件什么的一些基础的开发内容,所以最近一直在业余找练手的机会.由于之前没有接触过JS,自己学习起来还算是比较的吃力,一点一点的来吧!要持久. ...
- Ajax 小实例
1.urls.py url(r'^jiafa', views.jiafa), 2.views.py def jiafa(request): if request.method == "GET ...
- HttpWebRequest 禁用系统默认代理
方法一 将HttpWebRequest对象的Proxy属性设置为null 方法二 配置文件修改 <proxy usesystemdefault="False" />
- CAC的Debian-8-64bit安装BBR正确方式是?
裝过三台debian 64 bit, CAC, 2歐, KVM虛擬機 做法都一樣 0. 有裝銳速記得先刪除, 免得換核心後, 銳速在扯後腿 1.換4.9版kernel 有正式版 別裝啥rc版, 4.9 ...