赞
踩
OpenCV在图像处理与计算机视觉方面有很多通用算法。因此可以用来人脸识别、图形识别、文字识别等等。对于复杂一点识别的可能还涉及到大量的识别训练,最后的匹配比较分类等等。后续可能会介绍文字识别、人脸识别等等。
图形识别指的是对常见的几何图形进行识别,它通过opencv进图形处理(二值化,图片灰度化,细化等等),获取图形轮廓特征,然后在应用几何图形特征去识别为几何图形。目前对于自己绘画几何图形并识别总的来说,如果特征找到的好,识别率还是挺高的。
这两种划线方式对识别曲线来说,误差还是有点大,直线绘画起来没有因手抖动误差,这误差很容易影响到在图形识别处理中识别轮廓处理,从而影响到识别分类。
逻辑处理流程图
对于流程图不会的,可以借鉴这片网址与我的代码图。
参考网址: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: 图形
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
threhold() 阈值化
src:源图像,可以为8位的灰度图,也可以为32位的彩色图像。(两者由区别)
dst:输出图像
thresh:阈值
maxval:dst图像中最大值
type:阈值类型
参考网址:https://blog.csdn.net/u012566751/article/details/77046445
canny() 边缘检测算法
网址: https://www.cnblogs.com/pacino12134/p/9877971.html
absdiff()
void cvAbsDiff( const CvArr* src1, const CvArr* src2, CvArr* dst );
src1 第一个原数组
src2 第二个原数组
dst 输出数组
函数 cvAbsDiff 计算两个数组差的绝对值
approxPolyDP( 多边形逼近)
多边形逼近:
void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed);
参数说明:
InputArray curve:输入的点集
OutputArray approxCurve:输出的点集,当前点集是能最小包容指定点集的。draw出来即是一个多边形;
double epsilon:指定的精度,也即是原始曲线与近似曲线之间的最大距离。
bool closed:若为true,则说明近似曲线是闭合的,它的首位都是相连,反之,若为false,则断开。
findContours函数 查找轮廓
findContours( InputOutputArray image, OutputArrayOfArrays contours,
OutputArray hierarchy, int mode,
int method, Point offset=Point());
参考网址:https://blog.csdn.net/dcrmg/article/details/51987348#
convexHull() 函数 针对轮廓进行凸包计算
void convexHull(InputArray points,OutputArray hull,bool clockwise = false,bool returnPoints = true)
参数详解:
InputArray points: 得到的点集,一般是用图像轮廓函数求得的轮廓点
OutputArray hull: 输出的是凸包的二维xy点的坐标值,针对每一个轮廓形成的
bool clockwise = false: 表示凸包的方向,顺时针或者逆时针
bool returnPoint = true: 表示返回点还是点地址的索引
arcLength() 函数 图像轮廓的周长
double arcLength(InputArray curve, bool closed)
参数详解:
InputArray curve:表示图像的轮廓
bool closed:表示轮廓是否封闭的
contourArea()函数 轮廓面积
double cv::contourArea ( InputArray contour, bool oriented = false )
contour:是一个向量,二维点,可以是vector或Mat类型
oriented:有默认值false,面向区域标识符,如果为true,该函数返回一个带符号的面积,其正负取决于轮廓的方向(顺时针还是逆时针)。根据这个特性可以根据面积的符号来确定轮廓的位置。如果是默认值false,则面积以绝对值的形式返回.
pointPolygonTest()
此功能可查找图像中的点与轮廓之间的最短距离. 当点在轮廓外时返回负值,当点在内部时返回正值,如果点在轮廓上则返回零.
我们可以检查点(50,50)如下:
dist = cv2.pointPolygonTest(cnt,(50,50),True)
在函数中,第三个参数是measureDist。 如果为True,则查找签名距离. 如果为False,则查找该点是在内部还是外部或在轮廓上(它分别返回+1,-1,0)
NOTE
果您不想找到距离,请确保第三个参数为False,因为这是一个耗时的过程. 因此,将其设为False可提供2-3倍的加速.
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。