• opencv可以有多有趣


    opencv可以有多有趣

    前言

    这一段时间没怎么写博客,偶尔写一次也是比较正经的博客,感觉自己都不正常了。今天看课的时候突然来了灵感,那就整个烂活玩一玩。

    先把视频中的人物边缘找出来,然后再在一张白色底板上绘制出来,再配以rgb的变化,会是什么样的!

    来试试吧
    在这里插入图片描述

    内容

    首先我们需要一个有人物的视频,建议使用哪些人物和背景区分度比较高的视频。
    在这里插入图片描述

    我么想要完成的功能就是在视频中把一个人的轮廓画出来,然后随着视频一起播放。

    接下来就可以聊聊解决思路了。

    第一步其实先把图像给整成灰度图,直接使用opencv的cvtColor函数即可

    接下来为了方便提取人物的轮廓,我们需要做一下二值处理,这里使用的函数是threshold,这个函数中会设置一个的阈值,当像素值超过这个阈值时,会直接将像素值设置为我们预定的像素值,当小于阈值时,则会将像素值设置为0,这样就可以得到一个二值图像。如下图所示,可以看到轮廓很清晰了
    在这里插入图片描述

    相对于原视频,这个时候的图像已经很清楚的展示出了我们需要的内容,并且很容易就可以提取出轮廓

    这之后,再将轮廓画在视频上就可以了,如下图
    在这里插入图片描述

    接下来就可以开始搞代码了

    实现

    完整代码如下

    import numpy as np
    from 图像识别 import picutils
    import cv2
    # 读取视频
    cap = cv2.VideoCapture('xxx.mp4')
    # 设置标志位 超过5就变色
    m = 0
    while (1):
        m += 1
        # 颜色数组的下标
        l = 0
        # 颜色数组  实现rgb变化效果 
        colos = [[0, 0, 255], [0, 255, 0], [255, 0, 0]]
        # frame存储每一帧的图像
        ret, frame = cap.read()
        # 转换为灰度图
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 二值处理   这里的阈值设置为130可能不是最好的,可以试着再改改  超过130就会变255,否则就是0,从而实现二值图像的生成
        thresh = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)[1]
        # 边缘检测,检测出边缘方便轮廓提取
        edged = cv2.Canny(thresh, 75, 150)
        # 获取所有的轮廓,这里没有在进行处理,有兴趣可以提取出需要的
        cnts = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
        # 选择较大的轮廓
        real_cnts=[]
        for c in cnts:
            if cv2.arcLength(c,True)>30:
                real_cnts.append(c)
        # 设置一个白板图片,作为人物的背景板
        back = np.zeros((480, 720, 3), dtype="uint8") + 255
        # 展示5帧修改一次颜色数组的下标  l就是下标值
        if  m == 5:
            l = (l + 1) % 3
            m=0
        # 把轮廓绘制在白色的背景板上
        cv2.drawContours(back, real_cnts, -1, colos[l], 3)
        cv2.imshow('frame', back)
        k = cv2.waitKey(60) & 0xff
        # 等待退出键,就可以直接退出
        if k == 27:
            break
    
    cap.release()
    cv2.destroyAllWindows()
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    成果

    成果如下

    在这里插入图片描述

    刚接触opencv做的很粗糙

    在这里插入图片描述

  • 相关阅读:
    嵌入式面试笔试刷题(day14)
    oracle创建表空间、用户、权限以及导入dmp文件
    传输层协议 ——— TCP协议
    SpringCloudAlibaba 微服务讲解(二)微服务环境搭建
    Java项目:SSM网上鲜花商城
    使用Xshell远程连接虚拟机的linux
    stable diffusion实践操作-hypernetworks
    收藏10000+,网络安全行业应该考哪些证?
    关于组织开展2022年南京市创新产品(第一批)申报工作的通知
    深入理解Linux网络技术内幕(十)——帧的接收
  • 原文地址:https://blog.csdn.net/qq_43627076/article/details/125963655