OpenCV识别图形以及常用函数处理

news/2024/10/18 14:26:26/

前言
识别图形
常用函数介绍

前言

OpenCV在图像处理与计算机视觉方面有很多通用算法。因此可以用来人脸识别、图形识别、文字识别等等。对于复杂一点识别的可能还涉及到大量的识别训练,最后的匹配比较分类等等。后续可能会介绍文字识别、人脸识别等等。

图形识别

图形识别指的是对常见的几何图形进行识别,它通过opencv进图形处理(二值化,图片灰度化,细化等等),获取图形轮廓特征,然后在应用几何图形特征去识别为几何图形。目前对于自己绘画几何图形并识别总的来说,如果特征找到的好,识别率还是挺高的。

  1. 直线绘画
  2. 曲线绘画

这两种划线方式对识别曲线来说,误差还是有点大,直线绘画起来没有因手抖动误差,这误差很容易影响到在图形识别处理中识别轮廓处理,从而影响到识别分类。

逻辑处理流程图

Created with Raphaël 2.2.0 开始 一张图片 读取图片 图片灰度化 图片阈值化 图片细化 图片轮廓处理 依据特征(圆度、凸包等等)确认几何图形 图形 结束

对于流程图不会的,可以借鉴这片网址与我的代码图。
参考网址:https://blog.csdn.net/cui130/article/details/84840984

st=>start: 开始
e=>end: 结束
io=>inputoutput:  一张图片
st->io
op=>operation:   读取图片
st->io->op
op1=>operation:  图片灰度化
st->io->op->op1
op2=>operation:  图片阈值化
st->io->op->op1->op2
op3=>operation: 图片细化
st->io->op->op1->op2->op3
op4=>operation:      图片轮廓处理
st->io->op->op1->op2->op3->op4
op5=>operation:    依据特征(圆度、凸包等等)确认几何图形
st->io->op->op1->op2->op3->op4->op5
io2=>inputoutput:  图形

常用函数介绍

  1. cvtColor(); 空间颜色转换
    void cv::cvtColor(cv::InputArray src, cv::OutputArray dst, int code,int dstCn = 0)。
    src: // 输入图
    dst: // 输出图
    code : // 颜色映射类型,可以查表得到,有很多
    dstCn: // 输出的通道数 (0=‘automatic’),我们可以使用默认值,什么都不写
    参考网址:https://blog.csdn.net/liubing8609/article/details/78461488

  2. threhold() 阈值化
    在这里插入图片描述
    src:源图像,可以为8位的灰度图,也可以为32位的彩色图像。(两者由区别)
    dst:输出图像
    thresh:阈值
    maxval:dst图像中最大值
    type:阈值类型
    参考网址:https://blog.csdn.net/u012566751/article/details/77046445

  3. canny() 边缘检测算法

网址: https://www.cnblogs.com/pacino12134/p/9877971.html

  1. absdiff()
    void cvAbsDiff( const CvArr* src1, const CvArr* src2, CvArr* dst );  
    src1  第一个原数组  
    src2  第二个原数组  
    dst  输出数组  
    函数 cvAbsDiff 计算两个数组差的绝对值

  2. approxPolyDP( 多边形逼近)
    多边形逼近:
    void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed);
    参数说明:
    InputArray curve:输入的点集
    OutputArray approxCurve:输出的点集,当前点集是能最小包容指定点集的。draw出来即是一个多边形;
    double epsilon:指定的精度,也即是原始曲线与近似曲线之间的最大距离。
    bool closed:若为true,则说明近似曲线是闭合的,它的首位都是相连,反之,若为false,则断开。

  3. findContours函数 查找轮廓
    findContours( InputOutputArray image, OutputArrayOfArrays contours,
    OutputArray hierarchy, int mode,
    int method, Point offset=Point());
    参考网址:https://blog.csdn.net/dcrmg/article/details/51987348#

  4. convexHull() 函数 针对轮廓进行凸包计算
    void convexHull(InputArray points,OutputArray hull,bool clockwise = false,bool returnPoints = true)
    参数详解:
    InputArray points: 得到的点集,一般是用图像轮廓函数求得的轮廓点
    OutputArray hull: 输出的是凸包的二维xy点的坐标值,针对每一个轮廓形成的
    bool clockwise = false: 表示凸包的方向,顺时针或者逆时针
    bool returnPoint = true: 表示返回点还是点地址的索引

  5. arcLength() 函数 图像轮廓的周长
    double arcLength(InputArray curve, bool closed)
    参数详解:
    InputArray curve:表示图像的轮廓
    bool closed:表示轮廓是否封闭的

  6. contourArea()函数 轮廓面积
    double cv::contourArea ( InputArray contour, bool oriented = false )

contour:是一个向量,二维点,可以是vector或Mat类型
oriented:有默认值false,面向区域标识符,如果为true,该函数返回一个带符号的面积,其正负取决于轮廓的方向(顺时针还是逆时针)。根据这个特性可以根据面积的符号来确定轮廓的位置。如果是默认值false,则面积以绝对值的形式返回.

  1. pointPolygonTest()
    此功能可查找图像中的点与轮廓之间的最短距离. 当点在轮廓外时返回负值,当点在内部时返回正值,如果点在轮廓上则返回零.
    我们可以检查点(50,50)如下:
    dist = cv2.pointPolygonTest(cnt,(50,50),True)
    在函数中,第三个参数是measureDist。 如果为True,则查找签名距离. 如果为False,则查找该点是在内部还是外部或在轮廓上(它分别返回+1,-1,0)
    NOTE
    果您不想找到距离,请确保第三个参数为False,因为这是一个耗时的过程. 因此,将其设为False可提供2-3倍的加速.

  2. matchShapes() 形状匹配
    结果越低,匹配就越好
    功能:根据计算比较两张图像Hu不变距(函数返回值代表相似度大小,完全相同的图像返回值是0,返回值最大是1)
    double cvMatchShapes(const void* object1, const void* object2, int method, double parameter = 0);
    /*
    第一个参数是待匹配的物体1,第二个是待匹配的物体2
    第三个参数method有三种输入:
    CV_CONTOURS_MATCH_I1
    CV_CONTOURS_MATCH_I2
    CV_CONTOURS_MATCH_I3
    即三种不同的判定物体相似的方法
    第四个参数 Parameter 方法的具体参数(暂不支持)
    */
    参考网址:https://segmentfault.com/a/1190000015665320
    更多参考:https://blog.csdn.net/u013293580/article/details/83896844

如果在用python语言开发:
需要注意:
pip install imutils (图像操作库,缩放,旋转等等)
import cv
opecv在python中使用
https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv (在windows下的python 扩展包)
opencv_python‑3.4.6‑cp37‑cp37m‑win_amd64.whl


http://www.ppmy.cn/news/383891.html

相关文章

学计算机AMD不支持软件,解决系统提示“AMD安装程序无法正确识别AMD显卡硬件”的方法...

驱动在电脑中的作用是很重要的,它可以帮助电脑运行软件。很多用户在安装系统或是更改软件的时候会出现一些错误,例如下图中的提示:AMD安装程序无法正确识别AMD显卡硬件。这个故障并不是很好解决,不过小编还是找到了解决的方法&…

matlab图形编辑,matlab绘制图形plot属性编辑

matlab绘制图形plot属性编辑 matlab绘制图形plot属性编辑 使用plot绘制图形函数,设置其中的图形参数,包含线条颜色,粗细,线条类型。 x=1:15; y=x.^3; 方法一 是在plot中直接加入图形的参数属性,如下 设置图形线条颜色 h=plot(x,y,r); 或者 h=plot(x,y,color,red); 设置图…

arch linux对32amd,AMDGPU (简体中文)

翻译状态:本文是 AMDGPU 的翻译。上次翻译日期:2019-09-02。如果英文版本有所更改,则您可以帮助同步翻译。 amdgpu 是 AMD Radeon 显卡的开源图形驱动。 选择正确的驱动 请参考Xorg#AMD选择合适的显卡驱动,这个页面包含 AMDGPU 和 AMDGPU PRO的说明。 驱动不支持的显卡用户…

计算机图形学介绍

计算机图形学各个领域的目标或许不同,但最终的形式都是渲染(即绘制)在二维的显示设备上的图像。下面是一个简单(可能并不完全)的分类: 计算机图形学-领域及分支: 1 绘制 1.1 真实感绘制(非实时) 1.1.1 光线追踪(Ray-tr…

图形API的简单了解

本文图片来自:http://www.rastertek.com/choosing.html 大多数人都希望学习图形API,以便他们可以构建自己的3D或2D图形引擎。但是,随着最近发布的许多新API的选择,使用哪种API并非一帆风顺,尤其是某些API是专门为专业用户设计的。…

centos是arm还是amd_amd系列cpu安装linux

如何在 Linux 上安装 Intel 微代码固件 linux 的内核可以在引导时更新 cpu 固件,而无需 bios 更新。 处理器的微码保存在内存中,在每次启动系统时,内核可以更新这个微码。 这些来自 intelamd 的微码的更新可以去修复 bug 或者使用补丁来防范 bug。 如果你是一个 linux 系统管…

台式计算机图形设置,如何打开计算机图形设置以提高游戏质量?

通常,图形卡主要用于控制计算机图像的输出. 实际上,视频是图片的组合. 从上讲,图形卡是图形适配器,它与外部计算机显示屏有很大的关系. 作为计算机的最基本配置和最重要的附件之一,图形卡负责输出和显示图形. 那么,很多朋友可能会有这样的问题,那就是在哪里打开显卡设置…

常用图形渲染API简介

目前比较常用的图形渲染API有如下几种: Direct3DOpenGLVulkanMetal 下面会详细的介绍各种API的特点 Direct3D Direct3D(简称:D3D)是微软公司在Microsoft Windows操作系统上所开发的一套3D绘图编程接口,是DirectX的一部分,目前广…