精华内容
下载资源
问答
  • 基于opencv图像识别,识别图像中的色块,可以识别红色,绿色,蓝色的颜色区域,并二值化,学习opencv的基本代码
  • 点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达 本文转自|新机器视觉 有时候我们会使用树莓派和摄像头去做图像识别,在树莓派和LINUX系统中最常用...

    点击上方“小白学视觉”,选择加"星标"或“置顶

    重磅干货,第一时间送达
    
    本文转自|新机器视觉
    

    有时候我们会使用树莓派和摄像头去做图像识别,在树莓派和LINUX系统中最常用opencv去做图像识别,这次来介绍下树莓派安装opencv和用树莓派做图像识别。

    一、树莓派的系统

    安装就不介绍了。直接开机打开树莓派的命令窗口,安装openCV的依赖包,步骤有点多。

    1.1 更新系统

    $ sudo apt-get update$ sudo apt-get upgrade
    

    1.2 安装编译openCV源码的工具

    $ sudo apt-get install build-essential cmake pkg-config
    

    1.3 安装一些常见格式的图像处理和视频处理的包,方便我们能从硬盘上读取不同格式的图像和视频

    $ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev$ sudo apt-get install libxvidcore-dev libx264-dev
    

    1.4 openCV用于图像展示的功能需要依模块

    $ sudo apt-get install libgtk2.0-dev$ sudo apt-get install libatlas-base-dev gfortran
    

    接下来还需要安装python dev

    sudo apt-get install python2.7-dev python3-dev
    

    二、下载 并解压OpenCV 的资源库

    $ cd ~$ wget -O opencv.zip <a href="https://github.com/Itseez/opencv/archive/3.1.0.zip">https://github.com/Itseez/opencv/archive/3.1.0.zip</a>$ unzip opencv.zip$ wget -O opencv_contrib.zip <a href="https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip">https://github.com/Itseez/opencv_contrib/archive/3...</a> $ unzip opencv_contrib.zip
    

    三、接下来准备python的开发环境

    3.1 安装python包管理器:

    $ wget <a href="https://bootstrap.pypa.io/get-pip.py">https://bootstrap.pypa.io/get-pip.py</a> $ sudo python get-pip.py
    

    3.2 安装python虚拟环境

    $ sudo pip install virtualenv virtualenvwrapper$ sudo rm -rf ~/.cache/pip
    

    之后在~/.profile文件最后添加几行

    # virtualenv and virtualenvwrapperexport WORKON_HOME=$HOME/.virtualenvssource /usr/local/bin/virtualenvwrapper.sh
    

    3.3 接下来就是生成一个python虚拟环境用于opencv的开发环境

    $ mkvirtualenv cv -p python3
    

    打开一个命令窗口,执行下列命令,确认我们的cv环境已经生成好了

    $ source ~/.profile$ workon cv
    

    如果命令窗口前面的文字变成了(cv)则表明我们已成功创建了名为cv的python虚拟环境

    3.4 在cv虚拟环境下安装numpy

    (cv) -> ~ $ pip install numpy
    

    接下来的操作都要保持在cv环境中。

    四、编译和安装openCV

    4.1 一定要在cv环境里,接下来用cmake进行编译opencv

    $ cd ~/opencv-3.1.0/$ mkdir build$ cd build$ cmake -D ENABLE_PRECOMPILED_HEADERS=OFF \-D CMAKE_BUILD_TYPE=RELEASE \    -D CMAKE_INSTALL_PREFIX=/usr/local \    -D INSTALL_PYTHON_EXAMPLES=ON \    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules \    -D BUILD_EXAMPLES=ON ..
    

    4.2 开始编译opencv

    $ make -j4<br>
    

    编译过程大概会用好几个小时,请耐心等候,-j 是使用多少线程进行编译,在树莓派上使用的单线程编译,虽然速度会慢很多,但是不会死机,用-j4会有死机的可能。如果-j后不加数字,则默认不限制线程编译。

    编译过程如下

    4.3 安装opencv

    $ sudo make install$ sudo ldconfig
    

    4.4 python虚拟环境中链接到opencv模块

    我们需要将cv2.cpython-34m.so重命名为cv2.so

    $ cd /usr/local/lib/python3.4/site-packages/$ sudo mv cv2.cpython-34m.so cv2.so
    

    然后将python虚拟环境中的cv2.so链接到上面刚被改名为cv2.so的文件上

    $ cd ~/.virtualenvs/cv/lib/python3.4/site-packages/$ ln -s /usr/local/lib/python3.4/site-packages/cv2.so cv2.so
    

    五、测试OpenCV3是否安装成功

    $ source ~/.profile $ workon cv$ python>>> import cv2>>> cv2.__version__'3.1.0'>>>
    

    六、完成OpenCV的开发环境后,就可以跑几个简单的图像识别的DEMO

    其DEMO放在/usr/local/share/OpenCV/sample/python目录下

    我们将/usr/local/share/OpenCV/sample/文件拷贝到Downloads/sample/文件夹下

    跑几个DEMO

    边缘检测算法:(cv)   python edge.py

    模式识别算法:(cv)   python find_obj.py

    运动方向检测:(cv)   python lk_track.py

    大功告成,opencv是树莓派进行图像处理和识别的常用工具,如果配合树莓派CSI的摄像头获取相片并识别处理将会更加有趣,可以做成人脸识别或者人脸追踪。

    下载1:OpenCV-Contrib扩展模块中文版教程

    在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

    下载2:Python视觉实战项目52讲

    在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

    下载3:OpenCV实战项目20讲

    在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

    交流群

    欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

    展开全文
  • c++视频教程opencv视频图像处理机器视觉人脸识别深度学习vs2015,零基础到就业完整培训机构课程,很有名的一个机构
  • c++视频教程opencv视频图像处理机器视觉人脸识别深度学习vs2015,零基础到就业完整培训机构课程,很有名的一个机构
  • 基于OpenCV图像识别及跟踪程序

    热门讨论 2011-07-19 17:44:38
    视频图像中检索,识别出目标对象并进行跟踪。
  • JavaCV进阶opencv图像处理:ffmpeg视频图像画面人脸检测 前言 上一章已经讲了如何通过OpenCVFrameGrabber读取摄像头画面来进行图像检测,javacv官方的教程也是这样,在上一章的基础上可以自行扩展支持视频的...
    展开全文
  • opencv图像识别

    千次阅读 2016-02-28 15:39:19
    利用OpenCV检测图像中的长方形画布或纸张并提取图像内容   问题如下: 也就是在一张照片里,已知有个长方形的物体,但是经过了透视投影,已经不再是规则的长方形,那么如何提取这个图形里的内容呢?...


    利用OpenCV检测图像中的长方形画布或纸张并提取图像内容



     
    问题如下:




    也就是在一张照片里,已知有个长方形的物体,但是经过了透视投影,已经不再是规则的长方形,那么如何提取这个图形里的内容呢?这是个很常见的场景,比如在博物馆里看到一幅很喜欢的画,用手机找了下来,可是回家一看歪歪斜斜,脑补原画内容又觉得不对,那么就需要算法辅助来从原图里提取原来的内容了。不妨把应用的场景分为以下:
    纸张四角的坐标(图中红点)已知的情况


    也就是上面的左图中4个红点是可以准确获取,比如手动标注,那么就简单了:用OpenCV的Perspective Transform就可以。具体步骤如下:
    1) 将标注好的四个点坐标存入一个叫corner的变量里,比如上面的例子中,原图的分辨率是300x400,定义x和y的方向如下:


    那么纸张的四角对应的坐标分别是:
    左上:157.6, 71.5
    右上:295.6, 118.4   右下:172.4, 311.3   左下:2.4, 202.4
     
    把这四个坐标按如上顺序放到一个叫corner的变量里。如果我们打算把这幅图案恢复到一个300x400的图像里,那么按照对应的顺序把下面四个坐标放到一个叫canvas的变量里:
    左上:0, 0
    右上:300, 0
    右下:300, 400   左下:0, 400
     
    假设原图已经用OpenCV读取到一个叫image的变量里,那么提取纸张图案的代码如下:
    1 M = cv2.getPerspectiveTransform(corners, canvas)
    2 result = cv2.warpPerspective(image, M, (0, 0))
    把左图剪裁出来,去掉红点后试了试,结果如下:


    当然,其实这一步用Photoshop就可以了。。
    纸张四角的坐标未知或难以准确标注的情况


    这种场景可能是小屏幕应用,或是原始图像就很小,比如我这里用的这个300x400例子,点坐标很难精确标注。这种情况下一个思路是,用边缘检测提取纸张四边,然后求出四角坐标,再做Perspective Transform。
     
    1) 图像预处理
    一般而言即使做普通的边缘检测也需要提前对图像进行降噪避免误测,比如最常见的办法是先对图像进行高斯滤波,然而这样也会导致图像变得模糊,当待检测图形边缘不明显,或是图像本身分辨率不高的情况下(比如本文用的例子),会在降噪的同时把待检测的边缘强度也给牺牲了。具体到本文的例子,纸张是白色,背景是浅黄带纹路,如果进行高斯滤波是显然不行的,这时候一个替代方案是可以考虑使用Mean Shift,Mean Shift的优点就在于如果是像背景桌面的浅色纹理,图像分割的过程中相当于将这些小的浮动过滤掉,并且保留相对明显的纸张边缘,结果如下:
    原图


    处理后


    Meanshift的代码:
    1 image = cv2.pyrMeanShiftFiltering(image, 25, 10)
    因为主要目的是预处理降噪,windows size和color distance都不用太大,避免浪费计算时间还有过度降噪。降噪后可以看到桌面上的纹理都被抹去了,纸张边缘附近干净了很多。然而这还远远不够,图案本身,和图像里的其他物体都有很多明显的边缘,而且都是直线边缘。


    2) 纸张边缘检测


    虽然降噪了,可是图像里还是有很多边缘明显的元素。怎么尽量只保留纸张的边缘呢,这时候可以考虑用分割算法,把图像分为纸张部分和其他部分,这样分割的mask边缘就和纸张边缘应该是差不多重合的。在这里可以考虑用GrabCut,这样对于简单的情况,比如纸张或画布和背景对比强烈的,直接把图像边缘的像素作为bounding box就可以实现自动分割。当自动分割不精确的情况下再引入手动辅助分割,具体到我这里用的例子,背景和画面接近,所以需要手动辅助:


    结果如下:


    可以看到,分割后的结果虽然能基本区分纸张形状了,可是边缘并不准确,另外键盘和部分桌面没能区分开来。这时可以继续用GrabCut+手动标注得到只有纸张的分割。或者为了用户友好的话,尽量少引入手动辅助,那么可以考虑先继续到下一步检测边缘,再做后期处理。假设我们考虑后者,那么我们得到的是如下的mask:


    这个mask并不精确,所以不能直接用于边缘检测,但是它大致标出了图片里最明显的边缘位置所在,所以可以考虑下面的思路:保留降噪后位于mask边缘附近的信息用于真正的边缘检测,而把其他部分都模糊处理,也就是说基于上面得到的mask做出下面的mask用于模糊处理:


    基于这个mask得到的用于边缘检测的图像如下:


    用canny算子检测出边缘如下:


    3) 直线检测


    对检测到的边缘使用Hough变换检测直线,我例子里用的是cv2.HoughLinesP,分辨率1像素和1°,可以根据图像大小设置检测的阈值和minLineLength去除大部分误检测。特别提一下的是如果使用OpenCV的Python binding,OpenCV 2和OpenCV 3的结果结构是不一样的,如果进行代码移植需要相应的修改。检测到的结果如下:


    可以看到,有些线几乎重合在一起了,这是难以避免的,上图中一共检测到9条线,其中两对(下、右边缘)重合。可以通过距离判断和直线相对角度来判断并把重合线段合为一条:


    剩下的都是没有重合的线了。
    4) 判断纸张边缘


    那么如何选取纸张边缘的四条线呢(即使图像分割步骤非常好得分开了纸张和其他部分,这在有些情况下还是难以避免的,比如图案里有和边缘平行的线条),可以沿着提取线段的两边采样像素的灰度:


    在线段的两个端点之间平均采样左右两边像素的值,因为一般来说如果是纸张或者画布,边缘和背景的颜色在四边上应该都是类似的。然而这样做的话引入另外一个问题是需要区分线段的“左”和“右”,对于线段本身而言就是要区分前后。所以需要对画面里所有的线段端点进行排序,而这个排序的基准就是相对画布。


    具体到本文的例子就是把图像中心定义为所有线段的“左”边,如上图。而决定线段端点“前”和“后”可以用如下办法:


    先假设线段的前后端点,将两个端点坐标分别减去中心点(红点)的坐标,然后将得到的两个向量a和b求叉积,如果叉积大于0则说明假设正确,如果<0则交换假设的前后端点。线段端点的顺序确定后就可以进行采样了,简单起见可以分别采样左右两侧的像素灰度值,如果希望更准确可以采样RGB通道的值进行综合比较,下面是7条线段对应的两侧像素灰度的中值分布:


    可以看到其中有4个点距离非常近(红色),说明他们的像素灰度分布也很接近,把这4条选出来,结果如下:


    正是要的结果。


    5) 计算四角的坐标


    接下来计算四条线的交点,方法点这里。因为有4条线,会得到6个结果,因为在这种应用场景中,方形的物体在透视变换下不会出现凹角,所以直接舍弃离纸张中心最远的两个交点就得到了四个角的坐标,结果如下:






    这样就回到了一开始四角坐标已经得到的情况,直接进行透视变换就行了。


    Camera Calibration?


    写了这么多,其实有一条至关重要的假设,甚至可以说是最关键的步骤之一我一直没提,那就是Camera Calibration,如果有相机的情况下,meta data都知道,那么需要先坐Camera Calibration才能知道纸张或者画布的原始尺寸。我这里试的例子当然是没有的,也可以有,相应的算法OpenCV里也有现成的,不过即便如此还是非常麻烦,所以我的所有流程都是默认原始尺寸已经获得了。再说了,就算没有,变换回方形之后使用者凭感觉进行简单轴缩放都比Camera Calibration方便得多。。


    ========


    用 Python 和 OpenCV 检测图片上的条形码



     
    这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现。我所实现的算法本质上基于StackOverflow 上的这个问题,浏览代码之后,我提供了一些对原始算法的更新和改进。


    首先需要留意的是,这个算法并不是对所有条形码有效,但会给你基本的关于应用什么类型的技术的直觉。


    假设我们要检测下图中的条形码:






    图1:包含条形码的示例图片


    现在让我们开始写点代码,新建一个文件,命名为detect_barcode.py,打开并编码:


    1 # import the necessary packages
    2 import numpy as np
    3 import argparse
    4 import cv2
    5
    6 # construct the argument parse and parse the arguments
    7 ap = argparse.ArgumentParser()
    8 ap.add_argument("-i", "--image", required = True, help = "path to the image file")
    9 args = vars(ap.parse_args())
    我们首先做的是导入所需的软件包,我们将使用NumPy做数值计算,argparse用来解析命令行参数,cv2是OpenCV的绑定。


    然后我们设置命令行参数,我们这里需要一个简单的选择,–image是指包含条形码的待检测图像文件的路径。


    现在开始真正的图像处理:


    11 # load the image and convert it to grayscale
    12 image = cv2.imread(args["image"])
    13 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    14
    15 # compute the Scharr gradient magnitude representation of the images
    16 # in both the x and y direction
    17 gradX = cv2.Sobel(gray, ddepth = cv2.cv.CV_32F, dx = 1, dy = 0, ksize = -1)
    18 gradY = cv2.Sobel(gray, ddepth = cv2.cv.CV_32F, dx = 0, dy = 1, ksize = -1)
    19
    20 # subtract the y-gradient from the x-gradient
    21 gradient = cv2.subtract(gradX, gradY)
    22 gradient = cv2.convertScaleAbs(gradient)
    12~13行:从磁盘载入图像并转换为灰度图。


    17~18行:使用Scharr操作(指定使用ksize = -1)构造灰度图在水平和竖直方向上的梯度幅值表示。


    21~22行:Scharr操作之后,我们从x-gradient中减去y-gradient,通过这一步减法操作,最终得到包含高水平梯度和低竖直梯度的图像区域。


    上面的gradient表示的原始图像看起来是这样的:






    图:2:条形码图像的梯度表示


    注意条形码区域是怎样通过梯度操作检测出来的。下一步将通过去噪仅关注条形码区域。


    ?
    24 # blur and threshold the image
    25 blurred = cv2.blur(gradient, (9, 9))
    26 (_, thresh) = cv2.threshold(blurred, 225, 255, cv2.THRESH_BINARY)
    25行:我们要做的第一件事是使用9*9的内核对梯度图进行平均模糊,这将有助于平滑梯度表征的图形中的高频噪声。


    26行:然后我们将模糊化后的图形进行二值化,梯度图中任何小于等于255的像素设为0(黑色),其余设为255(白色)。


    模糊并二值化后的输出看起来是这个样子:






    图3:二值化梯度图以此获得长方形条形码区域的粗略近似


    然而,如你所见,在上面的二值化图像中,条形码的竖杠之间存在缝隙,为了消除这些缝隙,并使我们的算法更容易检测到条形码中的“斑点”状区域,我们需要进行一些基本的形态学操作:


    28 # construct a closing kernel and apply it to the thresholded image
    29 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))
    30 closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
    29行:我们首先使用cv2.getStructuringElement构造一个长方形内核。这个内核的宽度大于长度,因此我们可以消除条形码中垂直条之间的缝隙。


    30行:这里进行形态学操作,将上一步得到的内核应用到我们的二值图中,以此来消除竖杠间的缝隙。


    现在,你可以看到这些缝隙相比上面的二值化图像基本已经消除:






    图4:使用形态学中的闭运算消除条形码竖条之间的缝隙


    当然,现在图像中还有一些小斑点,不属于真正条形码的一部分,但是可能影响我们的轮廓检测。


    让我们来消除这些小斑点:


    32 # perform a series of erosions and dilations
    33 closed = cv2.erode(closed, None, iterations = 4)
    34 closed = cv2.dilate(closed, None, iterations = 4)
    我们这里所做的是首先进行4次腐蚀(erosion),然后进行4次膨胀(dilation)。腐蚀操作将会腐蚀图像中白色像素,以此来消除小斑点,而膨胀操作将使剩余的白色像素扩张并重新增长回去。


    如果小斑点在腐蚀操作中被移除,那么在膨胀操作中就不会再出现。


    经过我们这一系列的腐蚀和膨胀操作,可以看到我们已经成功地移除小斑点并得到条形码区域。






    图5:应用一系列的腐蚀和膨胀来移除不相关的小斑点


    最后,让我们找到图像中条形码的轮廓:


    36 # find the contours in the thresholded image, then sort the contours
    37 # by their area, keeping only the largest one
    38 (cnts, _) = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL,
    39  cv2.CHAIN_APPROX_SIMPLE)
    40 c = sorted(cnts, key = cv2.contourArea, reverse = True)[0]
    41
    42 # compute the rotated bounding box of the largest contour
    43 rect = cv2.minAreaRect(c)
    44 box = np.int0(cv2.cv.BoxPoints(rect))
    45
    46 # draw a bounding box arounded the detected barcode and display the
    47 # image
    48 cv2.drawContours(image, [box], -1, (0, 255, 0), 3)
    49 cv2.imshow("Image", image)
    50 cv2.waitKey(0)
    38~40行:幸运的是这一部分比较容易,我们简单地找到图像中的最大轮廓,如果我们正确完成了图像处理步骤,这里应该对应于条形码区域。


    43~44行:然后我们为最大轮廓确定最小边框


    48~50行:最后显示检测到的条形码


    正如你在下面的图片中所见,我们已经成功检测到了条形码:






    图6:成功检测到示例图像中的条形码


    下一部分,我们将尝试更多图像。


    成功的条形码检测


    要跟随这些结果,请使用文章下面的表单去下载本文的源码以及随带的图片。


    一旦有了代码和图像,打开一个终端来执行下面的命令:


    $ python detect_barcode.py --image images/barcode_02.jpg




    图7:使用OpenCV检测图像中的一个条形码


    检测椰油瓶子上的条形码没有问题。


    让我们试下另外一张图片:


    $ python detect_barcode.py --image images/barcode_03.jpg




    图8:使用计算机视觉检测图像中的一个条形码


    我们同样能够在上面的图片中找到条形码。


    关于食品的条形码检测已经足够了,书本上的条形码怎么样呢:


    $ python detect_barcode.py --image images/barcode_04.jpg




    图9:使用Python和OpenCV检测书本上的条形码


    没问题,再次通过。


    那包裹上的跟踪码呢?


    $ python detect_barcode.py --image images/barcode_05.jpg




    图10:使用计算机视觉和图像处理检测包裹上的条形码


    我们的算法再次成功检测到条形码。


    最后,我们再尝试一张图片,这个是我最爱的意大利面酱—饶氏自制伏特加酱(Rao’s Homemade Vodka Sauce):


    $ python detect_barcode.py --image images/barcode_06.jpg




    图11:使用Python和Opencv很容易检测条形码


    我们的算法又一次检测到条形码!


    总结


    这篇博文中,我们回顾了使用计算机视觉技术检测图像中条形码的必要步骤,使用Python编程语言和OpenCV库实现了我们的算法。


    算法概要如下:


    计算x方向和y方向上的Scharr梯度幅值表示
    将x-gradient减去y-gradient来显示条形码区域
    模糊并二值化图像
    对二值化图像应用闭运算内核
    进行系列的腐蚀、膨胀
    找到图像中的最大轮廓,大概便是条形码
    需要注意的是,该方法做了关于图像梯度表示的假设,因此只对水平条形码有效。


    如果你想实现一个更加鲁棒的条形码检测算法,你需要考虑图像的方向,或者更好的,应用机器学习技术如Haar级联或者HOG + Linear SVM去扫描图像条形码区域。


    ========


    数字万用表(七段数码管)的图像识别(opencv实现)



    版权声明:欢迎转载,但请保留文章原始出处:)http://blog.csdn.net/xgbing
            最近接触图像处理,要实现数字万用表数据的自动读取。我使用opencv+VC2005环境开发,OpenCV是Intel 开源计算机视觉库,它提供了强大的图像处理函数库。Opencv的介绍在这里太不多说,可以看看百度百科了解一下:http://baike.baidu.com/view/1343775.htm。
            万用表的识别过程是先提取摄像头的一帧数据,然后对这幅图像做处理:


    (1)提取摄像头的一帧数据
    [cpp] view plain copy 在CODE上查看代码片派生到我的代码片
    //读取摄像头一帧数据  
    img0=cvQueryFrame(m_Video);  


    (2)对图像进行平滑处理
    [cpp] view plain copy 在CODE上查看代码片派生到我的代码片
    cvSmooth(src_img, src_img,CV_GAUSSIAN, 5, 0);  


    (3)图像的灰度处理
    [cpp] view plain copy 在CODE上查看代码片派生到我的代码片
        cvCvtColor(src_img, gray_img, CV_BGR2GRAY);  
      
        //灰度图像  
    #ifdef SHOW_PROC_IMG  
        cvNamedWindow(PIC_GLAY_WINDOW_NAME, CV_WINDOW_AUTOSIZE);  
        cvShowImage(PIC_GLAY_WINDOW_NAME, gray_img);  
    #endif  


    (4)对图像进行直方图均衡化处理
    [cpp] view plain copy 在CODE上查看代码片派生到我的代码片
        IplImage* img_zf = cvCreateImage( img_size, IPL_DEPTH_8U, 1 );  
        cvEqualizeHist(gray_img, img_zf);  
      
        cvReleaseImage(&gray_img);  
      
    #ifdef SHOW_PROC_IMG  
        cvNamedWindow("直方图均衡化", CV_WINDOW_AUTOSIZE);  
        cvShowImage("直方图均衡化", img_zf);  
    #endif  


    (5)对图像进行二值化处理
    [cpp] view plain copy 在CODE上查看代码片派生到我的代码片
        //二值化图像  
        IplImage* pic2_img = cvCreateImage( img_size, IPL_DEPTH_8U, 1 );  
      
        cvThreshold(img_zf, pic2_img, 50, 255, CV_THRESH_BINARY_INV);  
        cvReleaseImage(&img_zf);  
    #ifdef SHOW_PROC_IMG  
        cvNamedWindow(PIC_2_WINDOW_NAME, CV_WINDOW_AUTOSIZE);  
        cvShowImage(PIC_2_WINDOW_NAME, pic2_img);  
    #endif  


    (6)细化处理
    [cpp] view plain copy 在CODE上查看代码片派生到我的代码片
        IplImage* img3 = cvCreateImage( img_size, IPL_DEPTH_8U, 1 );  
        cvZero(img3);  
      
        cvThin(pic2_img, img3, 5);//细化,通过修改iterations参数进一步细化  
        cvReleaseImage(&pic2_img);  
    #ifdef SHOW_PROC_IMG  
        cvNamedWindow("细化", CV_WINDOW_AUTOSIZE);  
        cvShowImage("细化", img3);  
    #endif  


    (7)图像腐蚀
    [cpp] view plain copy 在CODE上查看代码片派生到我的代码片
        IplImage* img4 = cvCreateImage( img_size, IPL_DEPTH_8U, 1 );  
          
      
        /图像腐蚀  
    #if 1  
        cvErode(img3, img4, NULL, 1);  
        cvReleaseImage(&img3);  
      
    #ifdef SHOW_PROC_IMG  
        cvNamedWindow("图像腐蚀", CV_WINDOW_AUTOSIZE);  
        cvShowImage("图像腐蚀", img4);    
    #endif  


    {8}图像膨胀
    [cpp] view plain copy 在CODE上查看代码片派生到我的代码片
        ///图像膨胀  
        IplConvKernel *iplele = cvCreateStructuringElementEx(3, 3, 0, 0, CV_SHAPE_RECT);      
      
        cvDilate(img4, img4, iplele, 1);  
      
        cvReleaseStructuringElement(&iplele);  
          
    #ifdef SHOW_PROC_IMG  
        cvNamedWindow("图像膨胀", CV_WINDOW_AUTOSIZE);  
        cvShowImage("图像膨胀", img4);  
    #endif  


    (9)进一步细化处理
    [cpp] view plain copy 在CODE上查看代码片派生到我的代码片
    IplImage* img3_2 = cvCreateImage( img_size, IPL_DEPTH_8U, 1 );  
    cvZero(img3_2);  
      
    cvThin(img4, img3_2, 5);//细化,通过修改iterations参数进一步细化  
    cvCopy(img3_2, img4);  
    cvReleaseImage(&img3_2);  


    (10)查找轮廓,进行数字分割
    [cpp] view plain copy 在CODE上查看代码片派生到我的代码片
    IplImage* img5 = cvCreateImage( img_size, IPL_DEPTH_8U, 1 );  
    cvCopy(img4, img5);  
      
    CvSeq *contour = NULL;  
    CvMemStorage* storage = cvCreateMemStorage(0);  
    cvFindContours( img5, storage, &contour, sizeof(CvContour),CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);  
      
    cvReleaseImage(&img5);  


    (11)消除杂点并进行数字的识别


    ========


    opencv 几种图像识别方法的速度和准确率比较



    最近需要使用 opencv 做一个项目,比较了几种算法,貌似都不能满足我的需求,下面看一下试验结果。git 地址 https://github.com/fredjiang/yutianDetect.git


    接着上一篇博客 http://fred.easymorse.com/?p=1358,这里比较一下几种不同算法的优缺点


    Screen Shot 2013 04 30 at 3 47 18 PM


    如上图,我这里组合使用了不同的 featureDetector、descriptorExtractor、matcher,分别对速度和准确率做了比较。


    输入框中的数字对应上图中的 -detectImage_x,右上角的数字是时间(毫秒),X 和 V 表示是否识别到了对象


    速度:


    Screenshot 2013 04 30 15 26 44 Screenshot 2013 04 30 15 26 54


    Screenshot 2013 04 30 15 27 06 Screenshot 2013 04 30 15 27 22


    准确率:


    Screenshot 2013 04 30 15 28 01 Screenshot 2013 04 30 15 28 17


    Screenshot 2013 04 30 15 28 39 Screenshot 2013 04 30 15 28 54


    根据以上结果,我想在 1 秒以内正确识别不同的图像,要么是速度不够,要么是准确率不够。


    看来只能看看还有不有其它的算法了,或者使用 haartraining 了。


    再补充一个


    Screen Shot 2013 04 30 at 5 02 06 PM


    -detectImage_4(时间3544,又快了 200 毫秒左右)


    ========


    图像处理和图像识别中常用的OpenCV函数  





    1、cvLoadImage:将图像文件加载至内存;


    2、cvNamedWindow:在屏幕上创建一个窗口;


    3、cvShowImage:在一个已创建好的窗口中显示图像;


    4、cvWaitKey:使程序暂停,等待用户触发一个按键操作;


    5、cvReleaseImage:释放图像文件所分配的内存;


    6、cvDestroyWindow:销毁显示图像文件的窗口;


    7、cvCreateFileCapture:通过参数设置确定要读入的AVI文件;


    8、cvQueryFrame:用来将下一帧视频文件载入内存;


    9、cvReleaseCapture:释放CvCapture结构开辟的内存空间;


    10、cvCreateTrackbar:创建一个滚动条;


     


    11、cvSetCaptureProperty:设置CvCapture对象的各种属性;


    12、cvGetCaptureProperty:查询CvCapture对象的各种属性;


    13、cvGetSize:当前图像结构的大小;


    14、cvSmooth:对图像进行平滑处理;


    15、cvPyrDown:图像金字塔,降采样,图像缩小为原来四分之一;


    16、cvCanny:Canny边缘检测;


    17、cvCreateCameraCapture:从摄像设备中读入数据;


    18、cvCreateVideoWriter:创建一个写入设备以便逐帧将视频流写入视频文件;


    19、cvWriteFrame:逐帧将视频流写入文件;


    20、cvReleaseVideoWriter:释放CvVideoWriter结构开辟的内存空间;


     


    21、CV_MAT_ELEM:从矩阵中得到一个元素;


    22、cvAbs:计算数组中所有元素的绝对值;


    23、cvAbsDiff:计算两个数组差值的绝对值;


    24、cvAbsDiffS:计算数组和标量差值的绝对值;


    25、cvAdd:两个数组的元素级的加运算;


    26、cvAddS:一个数组和一个标量的元素级的相加运算;


    27、cvAddWeighted:两个数组的元素级的加权相加运算(alpha运算);


    28、cvAvg:计算数组中所有元素的平均值;


    29、cvAvgSdv:计算数组中所有元素的绝对值和标准差;


    30、cvCalcCovarMatrix:计算一组n维空间向量的协方差;


     


    31、cvCmp:对两个数组中的所有元素运用设置的比较操作;


    32、cvCmpS:对数组和标量运用设置的比较操作;


    33、cvConvertScale:用可选的缩放值转换数组元素类型;


    34、cvCopy:把数组中的值复制到另一个数组中;


    35、cvCountNonZero:计算数组中非0值的个数;


    36、cvCrossProduct:计算两个三维向量的向量积(叉积);


    37、cvCvtColor:将数组的通道从一个颜色空间转换另外一个颜色空间;


    38、cvDet:计算方阵的行列式;


    39、cvDiv:用另外一个数组对一个数组进行元素级的除法运算;


    40、cvDotProduct:计算两个向量的点积;


     


    41、cvEigenVV:计算方阵的特征值和特征向量;


    42、cvFlip:围绕选定轴翻转;


    43、cvGEMM:矩阵乘法;


    44、cvGetCol:从一个数组的列中复制元素;


    45、cvGetCols:从数据的相邻的多列中复制元素;


    46、cvGetDiag:复制数组中对角线上的所有元素;


    47、cvGetDims:返回数组的维数;


    48、cvGetDimSize:返回一个数组的所有维的大小;


    49、cvGetRow:从一个数组的行中复制元素值;


    50、cvGetRows:从一个数组的多个相邻的行中复制元素值;


     


    51、cvGetSize:得到二维的数组的尺寸,以CvSize返回;


    52、cvGetSubRect:从一个数组的子区域复制元素值;


    53、cvInRange:检查一个数组的元素是否在另外两个数组中的值的范围内;


    54、cvInRangeS:检查一个数组的元素的值是否在另外两个标量的范围内;


    55、cvInvert:求矩阵的逆;


    56、cvMahalonobis:计算两个向量间的马氏距离;


    57、cvMax:在两个数组中进行元素级的取最大值操作;


    58、cvMaxS:在一个数组和一个标量中进行元素级的取最大值操作;


    59、cvMerge:把几个单通道图像合并为一个多通道图像;


    60、cvMin:在两个数组中进行元素级的取最小值操作;


     


    61、cvMinS:在一个数组和一个标量中进行元素级的取最小值操作;


    62、cvMinMaxLoc:寻找数组中的最大最小值;


    63、cvMul:计算两个数组的元素级的乘积(点乘);


    64、cvNot:按位对数组中的每一个元素求反;


    65、cvNormalize:将数组中元素进行归一化;


    66、cvOr:对两个数组进行按位或操作;


    67、cvOrs:在数组与标量之间进行按位或操作;


    68、cvReduce:通过给定的操作符将二维数组简为向量;


    69、cvRepeat:以平铺的方式进行数组复制;


    70、cvSet:用给定值初始化数组;


     


    71、cvSetZero:将数组中所有元素初始化为0;


    72、cvSetIdentity:将数组中对角线上的元素设为1,其他置0;


    73、cvSolve:求出线性方程组的解;


    74、cvSplit:将多通道数组分割成多个单通道数组;


    75、cvSub:两个数组元素级的相减;


    76、cvSubS:元素级的从数组中减去标量;


    77、cvSubRS:元素级的从标量中减去数组;


    78、cvSum:对数组中的所有元素求和;


    79、cvSVD:二维矩阵的奇异值分解;


    80、cvSVBkSb:奇异值回代计算;


     


    81、cvTrace:计算矩阵迹;


    82、cvTranspose:矩阵的转置运算;


    83、cvXor:对两个数组进行按位异或操作;


    84、cvXorS:在数组和标量之间进行按位异或操作;


    85、cvZero:将所有数组中的元素置为0;


    86、cvConvertScaleAbs:计算可选的缩放值的绝对值之后再转换数组元素的类型;


    87、cvNorm:计算数组的绝对范数, 绝对差分范数或者相对差分范数;


    88、cvAnd:对两个数组进行按位与操作;


    89、cvAndS:在数组和标量之间进行按位与操作; 


    90、cvScale:是cvConvertScale的一个宏,可以用来重新调整数组的内容,并且可以将参数从一种数


                      据类型转换为另一种;


     


    91、cvT:是函数cvTranspose的缩写;


    92、cvLine:画直线;


    93、cvRectangle:画矩形;


    94、cvCircle:画圆;


    95、cvEllipse:画椭圆;


    96、cvEllipseBox:使用外接矩形描述椭圆;


    97、cvFillPoly、cvFillConvexPoly、cvPolyLine:画多边形;


    98、cvPutText:在图像上输出一些文本;


    99、cvInitFont:采用一组参数配置一些用于屏幕输出的基本个特定字体;


    100、cvSave:矩阵保存;


     


    101、cvLoad:矩阵读取;


    102、cvOpenFileStorage:为读/写打开存储文件;


    103、cvReleaseFileStorage:释放存储的数据;


    104、cvStartWriteStruct:开始写入新的数据结构;


    105、cvEndWriteStruct:结束写入数据结构;


    106、cvWriteInt:写入整数型;


    107、cvWriteReal:写入浮点型;


    108、cvWriteString:写入字符型;


    109、cvWriteComment:写一个XML或YAML的注释字串;


    110、cvWrite:写一个对象;


     


    111、cvWriteRawData:写入多个数值;


    112、cvWriteFileNode:将文件节点写入另一个文件存储器;


    113、cvGetRootFileNode:获取存储器最顶层的节点;


    114、cvGetFileNodeByName:在映图或存储器中找到相应节点;


    115、cvGetHashedKey:为名称返回一个惟一的指针;


    116、cvGetFileNode:在映图或文件存储器中找到节点;


    117、cvGetFileNodeName:返回文件的节点名;


    118、cvReadInt:读取一个无名称的整数型;


    119、cvReadIntByName:读取一个有名称的整数型;


    120、cvReadReal:读取一个无名称的浮点型;


     


    121、cvReadRealByName:读取一个有名称的浮点型;


    122、cvReadString:从文件节点中寻找字符串;


    123、cvReadStringByName:找到一个有名称的文件节点并返回它;


    124、cvRead:将对象解码并返回它的指针;


    125、cvReadByName:找到对象并解码;


    126、cvReadRawData:读取多个数值;


    127、cvStartReadRawData:初始化文件节点序列的读取;


    128、cvReadRawDataSlice:读取文件节点的内容;


    129、cvGetModuleInfo:检查IPP库是否已经正常安装并且检验运行是否正常;


    130、cvResizeWindow:用来调整窗口的大小;


     


    131、cvSaveImage:保存图像;


    132、cvMoveWindow:将窗口移动到其左上角为x,y的位置;


    133、cvDestroyAllWindow:用来关闭所有窗口并释放窗口相关的内存空间;


    134、cvGetTrackbarPos:读取滑动条的值;


    135、cvSetTrackbarPos:设置滑动条的值;


    136、cvGrabFrame:用于快速将视频帧读入内存;


    137、cvRetrieveFrame:对读入帧做所有必须的处理;


    138、cvConvertImage:用于在常用的不同图像格式之间转换;


    139、cvErode:形态腐蚀;


    140、cvDilate:形态学膨胀;


     


    141、cvMorphologyEx:更通用的形态学函数;


    142、cvFloodFill:漫水填充算法,用来进一步控制哪些区域将被填充颜色;


    143、cvResize:放大或缩小图像;


    144、cvPyrUp:图像金字塔,将现有的图像在每个维度上都放大两倍;


    145、cvPyrSegmentation:利用金字塔实现图像分割;


    146、cvThreshold:图像阈值化;


    147、cvAcc:可以将8位整数类型图像累加为浮点图像;


    148、cvAdaptiveThreshold:图像自适应阈值;


    149、cvFilter2D:图像卷积;


    150、cvCopyMakeBorder:将特定的图像轻微变大,然后以各种方式自动填充图像边界;


    151、cvSobel:图像边缘检测,Sobel算子;


    152、cvLaplace:拉普拉斯变换、图像边缘检测;


    153、cvHoughLines2:霍夫直线变换;


    154、cvHoughCircles:霍夫圆变换;


    155、cvRemap:图像重映射,校正标定图像,图像插值;


    156、cvWarpAffine:稠密仿射变换;


    157、cvGetQuadrangleSubPix:仿射变换;


    158、cvGetAffineTransform:仿射映射矩阵的计算;


    159、cvCloneImage:将整个IplImage结构复制到新的IplImage中;


    160、cv2DRotationMatrix:仿射映射矩阵的计算;


    161、cvTransform:稀疏仿射变换;


    162、cvWarpPerspective:密集透视变换(单应性);


    163、cvGetPerspectiveTransform:计算透视映射矩阵;


    164、cvPerspectiveTransform:稀疏透视变换;


    165、cvCartToPolar:将数值从笛卡尔空间到极坐标(极性空间)进行映射;


    166、cvPolarToCart:将数值从极性空间到笛卡尔空间进行映射;


    167、cvLogPolar:对数极坐标变换;


    168、cvDFT:离散傅里叶变换;


    169、cvMulSpectrums:频谱乘法;


    170、cvDCT:离散余弦变换;


    171、cvIntegral:计算积分图像;


    172、cvDistTransform:图像的距离变换;


    173、cvEqualizeHist:直方图均衡化;


    174、cvCreateHist:创建一新直方图;


    175、cvMakeHistHeaderForArray:根据已给出的数据创建直方图;


    176、cvNormalizeHist:归一化直方图;


    177、cvThreshHist:直方图阈值函数;


    178、cvCalcHist:从图像中自动计算直方图;


    179、cvCompareHist:用于对比两个直方图的相似度;


    180、cvCalcEMD2:陆地移动距离(EMD)算法;


    181、cvCalcBackProject:反向投影;


    182、cvCalcBackProjectPatch:图块的方向投影;


    183、cvMatchTemplate:模板匹配;


    184、cvCreateMemStorage:用于创建一个内存存储器;


    185、cvCreateSeq:创建序列;


    186、cvSeqInvert:将序列进行逆序操作;


    187、cvCvtSeqToArray:复制序列的全部或部分到一个连续内存数组中;


    188、cvFindContours:从二值图像中寻找轮廓;


    189、cvDrawContours:绘制轮廓;


    190、cvApproxPoly:使用多边形逼近一个轮廓;


    191、cvContourPerimeter:轮廓长度;


    192、cvContoursMoments:计算轮廓矩;


    193、cvMoments:计算Hu不变矩;


    194、cvMatchShapes:使用矩进行匹配;


    195、cvInitLineIterator:对任意直线上的像素进行采样;


    196、cvSampleLine:对直线采样;


    197、cvAbsDiff:帧差;


    198、cvWatershed:分水岭算法;


    199、cvInpaint:修补图像;


    200、cvGoodFeaturesToTrack:寻找角点;


    201、cvFindCornerSubPix:用于发现亚像素精度的角点位置;


    202、cvCalcOpticalFlowLK:实现非金字塔的Lucas-Kanade稠密光流算法;


    203、cvMeanShift:mean-shift跟踪算法;


    204、cvCamShift:camshift跟踪算法;


    205、cvCreateKalman:创建Kalman滤波器;


    206、cvCreateConDensation:创建condensation滤波器;


    207、cvConvertPointsHomogenious:对齐次坐标进行转换;


    208、cvFindChessboardCorners:定位棋盘角点;


    209、cvFindHomography:计算单应性矩阵;


    210、cvRodrigues2:罗德里格斯变换;


    211、cvFitLine:直线拟合算法;


    212、cvCalcCovarMatrix:计算协方差矩阵;


    213、cvInvert:计算协方差矩阵的逆矩阵;


    214、cvMahalanobis:计算Mahalanobis距离;


    215、cvKMeans2:K均值;


    216、cvCloneMat:根据一个已有的矩阵创建一个新矩阵;


    217、cvPreCornerDetect:计算用于角点检测的特征图;


    218、cvGetImage:CvMat图像数据格式转换成IplImage图像数据格式;


    219、cvMatMul:两矩阵相乘;
    ========
    展开全文
  • opencv-图像人脸识别视频人脸识别

    千次阅读 2019-01-30 10:01:10
    首先可以取opencv官方github下载识别模型xml文件:...1,图像人脸识别 import cv2 filepath =r"C:\Users\Lavector\Desktop\1111.jpg" img = cv2.imread(filepath) # 读取图...

    首先可以取opencv官方github下载识别模型xml文件:https://github.com/lonngxiang/opencv/tree/master/data/haarcascades

    1,图像人脸识别

    import cv2
    
    filepath =r"C:\Users\Lavector\Desktop\1111.jpg"
    img = cv2.imread(filepath)  # 读取图片
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换灰色
    
    # OpenCV人脸识别分类器
    classifier = cv2.CascadeClassifier(
        r"C:\Users\Lavector\Desktop\cv_model\opencv\data\haarcascades\haarcascade_frontalface_default.xml"
    )
    color = (0, 255, 0)  # 定义绘制颜色
    # 调用识别人脸
    faceRects = classifier.detectMultiScale(
        gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
    if len(faceRects):  # 大于0则检测到人脸
        for faceRect in faceRects:  # 单独框出每一张人脸
            x, y, w, h = faceRect
            # 框出人脸
            cv2.rectangle(img, (x, y), (x + h, y + w), color, 2)
            # 左眼
            cv2.circle(img, (x + w // 4, y + h // 4 + 30), min(w // 8, h // 8),
                       color)
            #右眼
            cv2.circle(img, (x + 3 * w // 4, y + h // 4 + 30), min(w // 8, h // 8),
                       color)
            #嘴巴
            cv2.rectangle(img, (x + 3 * w // 8, y + 3 * h // 4),
                          (x + 5 * w // 8, y + 7 * h // 8), color)
    
    cv2.imshow("image", img)  # 显示图像
    c = cv2.waitKey(10)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    2,视频人脸识别

    import cv2
    
    
    # 图片识别方法封装
    def discern(img):
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        cap = cv2.CascadeClassifier(
            r"C:\Users\Lavector\Desktop\cv_model\opencv\data\haarcascades\haarcascade_frontalface_default.xml"
        )
        faceRects = cap.detectMultiScale(
            gray, scaleFactor=1.2, minNeighbors=3, minSize=(50, 50))
        if len(faceRects):
            for faceRect in faceRects:
                x, y, w, h = faceRect
                cv2.rectangle(img, (x, y), (x + h, y + w), (0, 255, 0), 2)  # 框出人脸
        cv2.imshow("Image", img)
    
    
    # 获取摄像头0表示第一个摄像头
    cap = cv2.VideoCapture(0)
    while (1):  # 逐帧显示
        ret, img = cap.read()
        # cv2.imshow("Image", img)
        discern(img)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()  # 释放摄像头
    cv2.destroyAllWindows()  # 释放窗口资源
    

    face_recognition
    https://github.com/ageitgey/face_recognition

    import face_recognition
    import cv2
    
    # This is a demo of running face recognition on live video from your webcam. It's a little more complicated than the
    # other example, but it includes some basic performance tweaks to make things run a lot faster:
    #   1. Process each video frame at 1/4 resolution (though still display it at full resolution)
    #   2. Only detect faces in every other frame of video.
    
    # PLEASE NOTE: This example requires OpenCV (the `cv2` library) to be installed only to read from your webcam.
    # OpenCV is *not* required to use the face_recognition library. It's only required if you want to run this
    # specific demo. If you have trouble installing it, try any of the other demos that don't require it instead.
    
    # Get a reference to webcam #0 (the default one)
    video_capture = cv2.VideoCapture(0)
    
    # Load a sample picture and learn how to recognize it.
    obama_image = face_recognition.load_image_file(r"F.jpg")
    obama_face_encoding = face_recognition.face_encodings(obama_image)[0]
    
    # Load a second sample picture and learn how to recognize it.
    # biden_image = face_recognition.load_image_file("biden.jpg")
    # biden_face_encoding = face_recognition.face_encodings(biden_image)[0]
    
    # Create arrays of known face encodings and their names
    known_face_encodings = [
        obama_face_encoding,
        # biden_face_encoding
    ]
    known_face_names = [
        "aa",
        # "Joe Biden"
    ]
    
    # Initialize some variables
    face_locations = []
    face_encodings = []
    face_names = []
    process_this_frame = True
    
    while True:
        # Grab a single frame of video
        ret, frame = video_capture.read()
    
        # Resize frame of video to 1/4 size for faster face recognition processing
        small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
    
        # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses)
        rgb_small_frame = small_frame[:, :, ::-1]
    
        # Only process every other frame of video to save time
        if process_this_frame:
            # Find all the faces and face encodings in the current frame of video
            face_locations = face_recognition.face_locations(rgb_small_frame)
            face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)
    
            face_names = []
            for face_encoding in face_encodings:
                # See if the face is a match for the known face(s)
                matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
                name = "Unknown"
    
                # If a match was found in known_face_encodings, just use the first one.
                if True in matches:
                    first_match_index = matches.index(True)
                    name = known_face_names[first_match_index]
    
                face_names.append(name)
    
        process_this_frame = not process_this_frame
    
    
        # Display the results
        for (top, right, bottom, left), name in zip(face_locations, face_names):
            # Scale back up face locations since the frame we detected in was scaled to 1/4 size
            top *= 4
            right *= 4
            bottom *= 4
            left *= 4
    
            # Draw a box around the face
            cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
    
            # Draw a label with a name below the face
            cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
            font = cv2.FONT_HERSHEY_DUPLEX
            cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)
    
        # Display the resulting image
        cv2.imshow('Video', frame)
    
        # Hit 'q' on the keyboard to quit!
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    # Release handle to the webcam
    video_capture.release()
    cv2.destroyAllWindows()
    
    展开全文
  • opencv图像识别训练实例

    万次阅读 多人点赞 2018-10-17 20:35:10
    本文按照如下顺序来进行详细解释如何进行图像识别训练过程: 制作图像 图像数据 图像训练 图像识别实例 选取图像集 我这里下载了12张杨幂的照片作为数据集来提取脸部照片ROI。 #include &lt;QApplication...
  • 本文设计一种基于OpenCV图像智能识别系统,利用摄像头采集图像,通过OpenCV的相关函数进行特征图像识别。针对食品药品加工过程中的特定问题进行模拟,实验表明,该系统具有较好的识别速度和识别效率,具有一定的...
  • Python+OpenCV3.3图像处理视频培训课程:该教程基于Python3.6+OpenCV新版本3.3.0详细讲述Python OpenCV图像处理部分内容,包括opencv人脸识别、人脸检测、数字验证码识别等内容。是Python开发者学习图像知识与应用...
  • Python-OpenCV图像识别学习

    千次阅读 2019-05-20 20:38:36
    代码已托管GitHub,仓库地址:OpenCV3-note,以下为仓库的README.md,介绍仓库信息及代码结构: OpenCV OpenCV的全称是Open Source Computer Vision Library,是一个跨...OpenCV可用于开发实时的图像处理、计算机...
  • opencv 图像人物识别

    万次阅读 2018-07-22 08:53:00
    原始网址 ...   OpenCV-1-图片处理 下载图片 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import cv2 import numpy as np img = cv2.imread('Lenna.png') #load RGB image imgG...
  • cv2:python的图像识别软件,据说功能非常强大,注意下载这个包的时候,不要搜索cv2,这个是没有的,应该搜索opencv-python,然后直接 import cv2 就可以了。 numpy :没啥说的,直接下载,强大的矩阵处理工具。 ...
  • 原文地址:图像处理和图像识别中常用的OpenCV函数1作者:xiaoli870804 1、cvLoadImage:将图像文件加载至内存; 2、cvNamedWindow:在屏幕上创建一个窗口; 3、cvShowImage:在一个已创建好的窗口中显示...
  • 目录OpenCV基础常规图像处理边缘检测亮度提升角点检测图像识别特征点检测STAR特征点检测SIFT特征点监测特征值矩阵物体识别案例人脸识别视频捕捉人脸定位人脸识别 OpenCV基础 opencv是一个计算机视觉库,用于图像处理...
  • OpenCV图像识别初探-50行代码教机器玩2D游戏

    千次阅读 多人点赞 2019-07-01 11:33:46
    本文简要介绍如何通过OpenCV实现简单的图像识别,并让计算机通过“视觉”自动玩一个简单的2D小游戏,文末有视频演示及完整代码。 0x01 OpenCV介绍 Open Source Computer Vision Library.OpenCV于1999年由Intel...
  • Python+OpenCV3.3图像处理视频培训课程:该教程基于Python3.6+OpenCV新版本3.3.0详细讲述Python OpenCV图像处理部分内容,包括opencv人脸识别、人脸检测、数字验证码识别等内容。是Python开发者学习图像知识与应用...
  • OpenCV的安装与实现VS环境设置,VS2017与OpenCV4.1.0的文件选择 https://blog.csdn.net/cfl997/article/details/92829765 视频: VideoCapture capture(0); 参数为0;默认打开本地摄像头; 换成地址即可。 用...
  • 树莓派自带摄像头OpenCV图像识别-二维码识别

    万次阅读 多人点赞 2017-12-23 10:37:57
    5、我们进入正题 二维码识别,我这里我们还需要装一个Python-zbar 输入命令 sudo apt-get install python-zbar 完成后直接使用下面程序运行 #!/usr/bin/env python #-*- coding: UTF-8 -*- # import ...
  • 说明:面部识别程序,可使用Python和OpenCV检测图像或实时摄像机供稿上的面部。 教程视频: https://www.youtube.com/watch?v=7IFhsbfby9s&list=WL&index=6&ab_channel=AdarshMenon 在Ubuntu / Linux上安装适用于...
  • 这是一个你值得拥有的,从入门开始,讲解的很详细,如果你想入门就从这个视频开始吧! 期待你来哦!
  • opencv人脸识别
  • 利用OpenCV实现实时图像识别和图像跟踪图像识别什么是图像识别图像识别的研究现状Android图像识别相关技术基于OpenCV实现实现思路代码部分权限设置AndroidMainifest.xml权限提示方法界面设计activity_img_...
  • 本人初学OpenCV做的项目,这个项目初始是用于手影识别,即使用摄像头拍摄,双手在摄像头前做出相关手影动作,程序使用匹配算法识别出用户正在模仿的动物,并触发对应事件。其实也可以识别并匹配其他内容(由模板文件...
  • python+opencv 实现图像人脸检测及视频中的人脸检测

    千次阅读 多人点赞 2020-09-01 17:13:38
    python+opencv 实现图像人脸检测及视频中的人脸检测,首先下载人脸检测要用到的分类器,熟悉opencv相关API的使用,然后利用python+opencv实现图像单人脸检测、图像多人脸检测、视频中人脸检测和摄像头人脸检测。
  • 近期学习了OpenCV的一些函数 然后配合着函数跟QT的一些UI写一个图像视频处理跟摄像头处理的一些功能 但是这个主要的一个框架是学习一个视频的 当时主要讲的是一个OpenCV视频处理的 UI是仿照一位作者的 然后因为...
  • Python+OpenCV3.3图像处理视频培训课程:该教程基于Python3.6+OpenCV新版本3.3.0详细讲述Python OpenCV图像处理部分内容,包括opencv人脸识别、人脸检测、数字验证码识别等内容。是Python开发者学习图像知识与应用...
  • 为什么博主之前一直没写人脸检测和识别?因为javacv官方首页的demo演示就是人脸检测,大家不必看博主再写一遍,所以博主一直没写。最近看了不少网上写得javacv人脸检测demo,能正常运行的没几个,剩下的也多多少少...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,343
精华内容 6,937
关键字:

opencv视频图像识别