C++ OpenCV实战之形状识别

目录
  • 前言
  • 一、图像预处理
  • 二、形状识别
  • 三、源码
  • 四、结果显示
  • 总结

前言

本案例通过使用OpenCV中的approxPolyDP进行多边形近似,进而进行基础形状识别(圆、三角形、矩形、星形…)。下面就一起来看看具体是如何实现的吧。

一、图像预处理

原图如图所示:

首先第一步先进行图像预处理,得到二值图像。

	Mat gray;
	cvtColor(src, gray, COLOR_BGR2GRAY);

	Mat gaussian;
	GaussianBlur(gray, gaussian, Size(3, 3), 0);

	Mat thresh;
	threshold(gaussian, thresh, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);

结果如图所示。接下来,需要对此二值图像进行轮廓提取,进而识别物体形状。

二、形状识别

本案例使用approxPolyDP进行形状识别,关于approxPolyDP OpenCV给出的定义是:

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

  • curve:表示输入轮廓点集,可以是 vector 或 Mat 类型。
  • approxCurve:多边形逼近结果,存储在approxCurve数组中。curve和approxCurve应该属于同一类型。
  • epsilon:表示逼近准确度,你允许在原多边形和最终拟合的多边形之间存在的最大偏差。一般以其周长的百分比进行近似。
  • closed:指明curve中的一系列点是否是一个闭合的多边形。若设为true,则认为曲线是闭合的。

我们通过统计多边形的“边”数来识别物体形状。

三、源码

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;

//基础几何形状识别
bool Pattern_Recognition(Mat& src)
{
	//图像预处理
	Mat gray;
	cvtColor(src, gray, COLOR_BGR2GRAY);

	Mat gaussian;
	GaussianBlur(gray, gaussian, Size(3, 3), 0);

	Mat thresh;
	threshold(gaussian, thresh, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);

	//轮廓查找
	vector<vector<Point>>contours;//轮廓点集
	findContours(thresh, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
	vector<vector<Point>>conPoly(contours.size());//多边形逼近结果,与轮廓一一对应

	for (int i = 0; i < contours.size(); i++)
	{
		double area = contourArea(contours[i]); //轮廓面积

		if (area > 1000)
		{
			Rect rect = boundingRect(contours[i]);//外界矩形

			double ratio = double(rect.width) / double(rect.height);//长宽比

			double peri = arcLength(contours[i], true);//周长

			approxPolyDP(contours[i], conPoly[i], 0.02 * peri, true);//多边形近似

			int objSize = conPoly[i].size();//折线数--通过判断轮廓有几条边来识别图形

			string objName;
			Scalar color;
			if (objSize == 3)
			{
				objName = "Triangle";//三角形
				color = Scalar(0, 0, 255);
			}
			if (objSize == 4)
			{
				//通过长宽比判断正方形/长方形
				if (ratio > 0.99 && ratio < 1.01)
				{
					objName = "Square";//正方形
					color = Scalar(0, 255, 255);
				}
				else
				{
					objName = "Rectangle";//长方形
					color = Scalar(0, 255, 0);
				}
			}
			if (objSize == 8)
			{
				objName = "Circle";//圆形
				color = Scalar(255, 255, 0);
			}
			if (objSize == 10)
			{
				objName = "Star";//星形
				color = Scalar(255, 0, 255);
			}

			//效果绘制
			rectangle(src, rect, color, 2);
			putText(src, objName, rect.tl(), FONT_HERSHEY_SIMPLEX, 1, color, 2);
		}
	}

	return true;
}

int main()
{
	Mat src = imread("src.jpeg");
	if (src.empty())
	{
		cout << "No Image!" << endl;
		system("pause");
		return -1;
	}

	if (!Pattern_Recognition(src))return false;

	namedWindow("test", WINDOW_NORMAL);
	imshow("test", src);
	waitKey(0);
	system("pause");
	return 0;
}

四、结果显示

总结

本文使用OpenCV C++ 进行基础形状识别,其实原理很简单,主要操作有以下几点。

1、图像预处理

2、物体轮廓提取

3、使用approxPolyDP进行多边形近似,进而统计出该物体的“边”数,从而识别出物体形状。

到此这篇关于C++ OpenCV实战之形状识别的文章就介绍到这了,更多相关C++ OpenCV形状识别内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • c++ 基于opencv 识别、定位二维码

    前言 因工作需要,需要定位图片中的二维码:我遂查阅了相关资料,也学习了opencv开源库.通过一番努力,终于很好的实现了二维码定位.本文将讲解如何使用opencv定位二维码. 定位二维码不仅仅是为了识别二维码:还可以通过二维码对图像进行水平纠正以及相邻区域定位.定位二维码,不仅需要图像处理相关知识,还需要分析二维码的特性,本文先从二维码的特性讲起. 1 二维码特性 二维码在设计之初就考虑到了识别问题,所以二维码有一些特征是非常明显的. 二维码有三个"回""字形图案,这一点非常

  • C++ opencv实现车道线识别

    本文实例为大家分享了C++ opencv实现车道线识别的具体代码,供大家参考,具体内容如下 先上图 1. 2. (一)目前国内外广泛使用的车道线检测方法主要分为两大类: (1) 基于道路特征的车道线检测: (2) 基于道路模型的车道线检测. 基于道路特征的车道线检测作为主流检测方法之一,主要是利用车道线与道路环境的物理特征差异进行后续图像的分割与处理,从而突出车道线特征,以实现车道线的检测.该方法复杂度较低,实时性较高,但容易受到道路环境干扰. 基于道路模型的车道线检测主要是基于不同的二维或三维

  • C++ OpenCV实现银行卡号识别功能

    目录 前言 一.获取模板图像 1.1 功能效果 1.2 功能源码 二.银行卡号定位 2.1 将银行卡号切割成四块 2.2 字符切割 三.字符识别 3.1.读取文件 3.2.字符匹配 3.3.功能源码 四.效果显示 4.1 功能源码 4.2 效果显示 五.源码 5.1 hpp文件 5.2 cpp文件 5.3 main文件 总结 前言 本文将使用OpenCV C++ 进行银行卡号识别.主要步骤可以细分为: 1. 获取模板图像 2.银行卡号区域定位 3.字符切割 4.模板匹配 5.效果显示 接下来就具

  • C++ OpenCV技术实战之身份证离线识别

    目录 总体思路 图像的预处理 主要代码 实现效果 OpenCV身份证离线识别技术的主要技术就是通过OpenCV找到身份证号码区域,然后通过OCR进行数字识别该区域的截图即可得到身份证号码.本地ORC使用tess-two来完成,Tesseract是C++实现的OCR引擎,在Android中使用不是很方便,需要封装JavaAPI才能在Android平台中进行调用,然而tess-two已经帮我们做好了这些事情,通过集成tess-two就可以很方便的完成文字识别. 总体思路 图像的预处理 1.无损压缩

  • C++基于OpenCV实现手势识别的源码

    先给大家上效果图: 源码在下面 使用 RGB 值分割手部区域,即手部的 GB 值将与背景不同 或者使用边缘检测 或者 背景减法. 我这里使用了背景减法模型.OpenCV为我们提供了不同的背景减法模型,codebook   它的作用是对某些帧进行一段时间的精确校准.其中对于它获取的所有图像:它计算每个像素的平均值和偏差,并相应地指定框. 在前景中它就像一个黑白图像,只有手是白色的 用 Convex Hull 来找到指尖.Convex hull 基本上是包围手部区域的凸集. 包围手的红线是凸包.基本

  • C++ OpenCV实战之手势识别

    目录 前言 一.手部关键点检测 1.1 功能源码 1.2 功能效果 二.手势识别 2.1算法原理 2.2功能源码 三.结果显示 3.1功能源码 3.2效果显示 四.源码 总结 前言 本文将使用OpenCV C++ 实现手势识别效果.本案例主要可以分为以下几个步骤: 1.手部关键点检测 2.手势识别 3.效果显示 接下来就来看看本案例具体是怎么实现的吧!!! 一.手部关键点检测 如图所示,为我们的手部关键点所在位置.第一步,我们需要检测手部21个关键点.我们使用深度神经网络DNN模块来完成这件事.

  • C++ OpenCV实战之形状识别

    目录 前言 一.图像预处理 二.形状识别 三.源码 四.结果显示 总结 前言 本案例通过使用OpenCV中的approxPolyDP进行多边形近似,进而进行基础形状识别(圆.三角形.矩形.星形…).下面就一起来看看具体是如何实现的吧. 一.图像预处理 原图如图所示: 首先第一步先进行图像预处理,得到二值图像. Mat gray; cvtColor(src, gray, COLOR_BGR2GRAY); Mat gaussian; GaussianBlur(gray, gaussian, Size

  • Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)

    可以直接跳到最后整体代码看一看是不是很少的代码!!!! 思路: 1. 数据的整合 2. 图片的灰度转化 3. 图片的二值转化 4. 图片的轮廓识别 5. 得到图片的顶点数 6. 依据顶点数判断图像形状 一.原数据的展示 图片文件共36个文件夹,每个文件夹有100张图片,共3600张图片. 每一个文件夹里都有形同此类的图形 二.数据的整合 对于多个文件夹,分析起来很不方便,所有决定将其都放在一个文件夹下进行分析,在python中具体实现如下: 本次需要的包 import cv2 import os

  • Opencv 图片的OCR识别的实战示例

    一.图片变换 0.导入模块 导入相关函数,遇到报错的话,直接pip install 函数名. import numpy as np import argparse import cv2 参数初始化 ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required = True, help = "Path to the image to be scanned") arg

  • 人脸识别实战之Opencv+SVM实现人脸识别

    目录 前言 项目结构 编码 训练人脸识别模型 识别图像中的人脸 摄像头识别人脸 前言 在本文中,您将学习如何使用 OpenCV 进行人脸识别.文章分三部分介绍: 第一,将首先执行人脸检测,使用深度学习从每个人脸中提取人脸量化为128位的向量. 第二, 在嵌入基础上使用支持向量机(SVM)训练人脸识别模型. 第三,最后使用 OpenCV 识别图像和视频流中的人脸. 项目结构 编码 新建face_embeddings.py脚本,写入如下代码: # import the necessary packa

  • C++ OpenCV实战之手写数字识别

    目录 前言 一.准备数据集 二.KNN训练 三.模型预测及结果显示 四.源码 总结 前言 本案例通过使用machine learning机器学习模块进行手写数字识别.源码注释也写得比较清楚啦,大家请看源码注释!!! 一.准备数据集 原图如图所示:总共有0~9数字类别,每个数字共20个.现在需要将下面图片切分成训练数据图片.测试数据图片.该图片尺寸为560x280,故将其切割成28x28大小数据图片.具体请看源码注释. const int classNum = 10; //总共有0~9个数字类别

  • Python OpenCV实战之与机器学习的碰撞

    目录 0. 前言 1. 机器学习简介 1.1 监督学习 1.2 无监督学习 1.3 半监督学习 2. K均值 (K-Means) 聚类 2.1 K-Means 聚类示例 3. K最近邻 3.1 K最近邻示例 4. 支持向量机 4.1 支持向量机示例 小结 0. 前言 机器学习是人工智能的子集,它为计算机以及其它具有计算能力的系统提供自动预测或决策的能力,诸如虚拟助理.车牌识别系统.智能推荐系统等机器学习应用程序给我们的日常生活带来了便捷的体验.机器学习的蓬勃发展,得益于以下三个关键因素:1) 海

  • OpenCV实战之OpenCV中的颜色空间

    目录 1 不同的色彩空间 1.1RGB颜色空间 1.2 Lab色彩空间 1.3  YCrCb颜色空间 1.4 HSV颜色空间 2 如何使用这些颜色空间进行分割 2.1 获取特定颜色的颜色值 2.2 应用分段阈值 在本教程中,我们将了解计算机视觉中常用的色彩空间,并将其用于基于颜色分割.我们还将用C ++和Python共享演示代码. 在进行色彩分割时很多项目没有考虑到不同光照条件的影响,会严重影响结果.在许多计算机视觉应用中遇到这个问题,涉及基于颜色的分割,如肤色检测,交通灯识别等.所以构建一个强

  • Python Opencv使用ann神经网络识别手写数字功能

    opencv中也提供了一种类似于Keras的神经网络,即为ann,这种神经网络的使用方法与Keras的很接近.关于mnist数据的解析,读者可以自己从网上下载相应压缩文件,用python自己编写解析代码,由于这里主要研究knn算法,为了图简单,直接使用Keras的mnist手写数字解析模块.本次代码运行环境为:python 3.6.8opencv-python 4.4.0.46opencv-contrib-python 4.4.0.46 下面的代码为使用ann进行模型的训练: from kera

  • Python+OpenCV实战之实现文档扫描

    目录 1.效果展示 2.项目准备 3.代码的讲解与展示 4.项目资源 5.项目总结与评价 1.效果展示 网络摄像头扫描: 图片扫描: 最终扫描保存的图片: (视频) (图片) 2.项目准备 今天的项目文件只需要两个.py文件,其中一个.py文件是已经写好的函数,你将直接使用它,我不会在此多做讲解,因为我们将会在主要的.py文件import 导入它,如果想了解其中函数是如何写的,请自行学习. utlis.py,需要添加的.py文件 import cv2 import numpy as np # T

随机推荐