热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:计算机视觉之从OpenCV到物体识别

篇首语:本文由编程笔记#小编为大家整理,主要介绍了计算机视觉之从OpenCV到物体识别相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了计算机视觉之从OpenCV到物体识别相关的知识,希望对你有一定的参考价值。










前言:上一章节我们学会了图片、视频以及外设获取帧图片的方式,以及OpenCV 的灰度图片处理。计算机不像人眼可以很轻易地辨别物体,本质是将一张图片转换成灰度图,通过一定的模型训练,使得机器能够从0,1(黑与白)中分辨物体的特征,由局部到整体,图片越复杂,所需的训练程度越高。这一章节我们接着上一chapter 来实操,慢慢见证从0到1 的过程。
















计算机视觉之从OpenCV到物体识别(二)











01























OpenCV 图像处理










上一chapter 我们简单地学会了image,video,camera device 设备的图片获取方法,接下来,我们来了解openCV 能够在图片上可以干的事情。




    

    import cv2
    import numpy as np
    img = cv2.imread("resource/lena.jpeg")
    kernel = np.ones((5,5),np.uint8)
    # 灰度图
    imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    # 图片模糊
    imgBlur = cv2.GaussianBlur(imgGray,(3,3),0)
    # 边缘图片
    imgCanny = cv2.Canny(img,150,150)
    # 边缘厚度 iterations 迭代次数
    imgDialation = cv2.dilate(imgCanny,kernel,iterations=1)
    # 图片侵蚀
    imgEroded = cv2.erode(imgDialation,kernel,iterations=1)
    cv2.imshow("grayImg",imgGray)
    cv2.imshow("blurImg",imgBlur)
    cv2.imshow("CannyImg",imgCanny)
    cv2.imshow("DialationImg",imgDialation)
    cv2.imshow("ErodedImg",imgEroded)





计算机视觉之从OpenCV到物体识别(二)


    kernel = np.ones((5,5),np.uint8)

np.ones(5,5) 表示使用numpy 创建一个5x5 且元素都为“1”的矩阵

iterations 表示迭代次数,iterations 值越大,在边缘厚度以及侵蚀处理时,图片厚度和侵蚀度越高。可以尝试调节iterations 值大小,观察其变化。










02























OpenCV 图片裁剪












    import cv2

    import numpy as np
    # imgResize
    teslaImg = cv2.imread("resource/tesla.jpeg")
    cv2.imshow("teslaImg",teslaImg)
    print(teslaImg.shape) #(480,640,3) 高:480 宽:640 3:频道数:BGR
    imgResize = cv2.resize(teslaImg,(300,200))
    cv2.imshow("imgResize",imgResize)
    print(imgResize.shape) #(200, 300, 3) 高:200 宽:300 3:频道数:BGR
    # 获取图像指定部分
    imgCropped = teslaImg[0:200,200:500]

    cv2.imshow("imgCropped",imgCropped)




计算机视觉之从OpenCV到物体识别(二)

    imgResize = cv2.resize(teslaImg,(300,200))

表示重新指定图片size,(300,200)表示宽高

    imgCropped = teslaImg[0:200,200:500]

表示裁剪获取指定区域图片










03























OpenCV 图片绘制









    import cv2

    import numpy as np
    # 图片绘制
    # 使用numpy 创建矩阵

    imgBlack = np.zeros((500,500,3),np.uint8) # 0表示黑色
    imgWhite = np.ones((500,500,3)) # 1表示白色
    cv2.imshow("imgBlack",imgBlack)
    cv2.imshow("imgWhite",imgWhite)
    print('image shape',imgBlack.shape)



计算机视觉之从OpenCV到物体识别(二)

可以看到我们分别创建了一个纯白和纯黑的图片出来,console 打印的shape 为 (500,500,3),表示一个500x500,带有GBR 通道 的矩阵。

    np.zeros((500,500,3)

np.zeros 表示创建了一个全0,500x500 的矩阵,带有BGR 通道,最终获取了一张纯黑色的图片,同理np.ones表示创建了一个全1,500x500 的矩阵,最终获取了一张纯白色图片。



    import cv2

    import numpy as np


    # 图片绘制
    # 使用numpy 创建矩阵
    imgBlack = np.zeros((500,500,3),np.uint8) # 0表示黑色
    # 给图片上色
    imgBlack[:] = 255,0,0 # 蓝色
    cv2.imshow("BlueHole",imgBlack)
    imgBlack[200:300,100:300] = 255,0,0 # 部分蓝色
    cv2.imshow("BluePart",imgBlack)
    # 画线
    cv2.line(imgBlack,(0,0),(300,300),(0,255,0),3) # 3厚度 GBR ,blue
    # imgBlack.shape[1] 高 imgBlack.shape[0] 宽 ,得到对角线
    cv2.line(imgBlack,(0,0),(imgBlack.shape[1],imgBlack.shape[0]),(0,255,0),3) # 3厚度 GBR ,blue
    # 长方形
    cv2.rectangle(imgBlack,(200,0),(400,200),(0,0,255),3)
    # 圆
    cv2.circle(imgBlack,(100,100),100,(255,255,0),1)
    # 放置文本
    cv2.putText(imgBlack,"OpenCV",(250,250),cv2.FONT_HERSHEY_COMPLEX,1,(255,255,255),5)

    cv2.imshow("totalImg",imgBlack)



计算机视觉之从OpenCV到物体识别(二)










04























OpenCV 获取指定图片中的特定物体









    import cv2

    import numpy as np
    # 提取指定图像
    pokerImg = cv2.imread("resource/puke.jpg")
    cv2.imshow("pokerWholeImg",pokerImg)
    print(pokerImg.shape)
    # 获取Joker 四个点坐标
    width,height = 150,225
    pts1 = np.float32([[405,278],[497,343],[303,418],[399,487]])
    # 定义原点,宽高
    pts2 = np.float32([[0,0],[width,0],[0,height],[width,height]])
    matrix = cv2.getPerspectiveTransform(pts1,pts2)
    imgOutPut = cv2.warpPerspective(pokerImg,matrix,(width,height))

    cv2.imshow("outPutPoker",imgOutPut)



计算机视觉之从OpenCV到物体识别(二)


 

   # 获取Joker 四个点坐标

    width,height = 150,225
    pts1 = np.float32([[405,278],[497,343],[303,418],[399,487]])
    # 定义原点,宽高

    pts2 = np.float32([[0,0],[width,0],[0,height],[width,height]])


pts2 表示生成的图片指定的(x,y,width,height)

我们可以看到目标黑桃J 被单独拉扯了出来,至此,我们离目标图像识别更近了一步





















扫码加我


共度难关




计算机视觉之从OpenCV到物体识别(二)

















END

































推荐阅读
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • 本文整理了Java中org.apache.solr.common.SolrDocument.setField()方法的一些代码示例,展示了SolrDocum ... [详细]
author-avatar
mobiledu2502861463
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有