opencv可以有多有趣

16 篇文章 15 订阅
2 篇文章 0 订阅

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()


成果

成果如下

在这里插入图片描述

刚接触opencv做的很粗糙

在这里插入图片描述

  • 87
    点赞
  • 124
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 72
    评论
OpenCV小项目 这是一个个人在使用OpenCV过程中写的一些小项目,以及一些非常有用的OpenCV代码,有些代码是对某论文中的部分实现。 注意:代码是在Xcode里写的,如果要在win下测试,遇到问题自己修改。 opencv-rootsift-py 用pythonOpenCV写的一个rootsift实现,其中RootSIFT部分的代码参照Implementing RootSIFT in Python and OpenCV这篇文章所写,通过这个你可以了解Three things everyone should know to improve object retrieval这篇文章中RootSIFT是怎么实现的。 sift(asift)-match-with-ransac-cpp 用C++和OpenCV写的一个图像匹配实现,里面包含了采用1NN匹配可视化、1NN匹配后经RANSAC剔除错配点可视化、1NN/2NN<0.8匹配可视化、1NN/2NN<0.8经 RANSAC剔除错配点可视化四个过程,其中1NN/2NN<0.8匹配过程是Lowe的Raw feature match,具体可以阅读Lowe的Distinctive image features from scale-invariant keypoints这篇文章。这个对图像检索重排非常有用。另外里面还有用OpenCV写的ASIFT,这部分来源于OPENCV ASIFT C++ IMPLEMENTATION,ASIFT还可以到官网页面下载,ASIFT提取的关键点 比SIFT要多得多,速度非常慢,不推荐在对要求实时性的应用中使用。 更多详细的分析可以阅读博文SIFT(ASIFT) Matching with RANSAC。 有用链接 OpenCV3.0文档 // 测试sparse unsigned int centersNum = 10; vector descrNums; descrNums.push_back(8); descrNums.push_back(12); //unsigned int T[] = {1, 2, 1, 3, 2, 5, 4, 3, 10, 5; 4, 2, 6, 5, 2, 5, 4, 6, 2, 4}; unsigned int T[] = {1, 2, 1, 3, 2, 5, 4, 3, 10, 5, 4, 2, 6, 5, 2, 5, 4, 6, 2, 4}; sp_mat Hist(descrNums.size(), centersNum); static long int count = 0; for (int i = 0; i < descrNums.size(); i++){ unsigned int* desrcElementsTmp = new unsigned int[descrNums[i]]; memcpy(desrcElementsTmp, T + count, descrNums[i] * sizeof(T[0])); //cout << desrcElementsTmp[0] << '\t' << desrcElementsTmp[1] << '\t' << desrcElementsTmp[2] << '\t' << desrcElementsTmp[3] << '\t' << desrcElementsTmp[4] << '\t' <<endl; //cout << desrcElementsTmp[5] << '\t' << desrcElementsTmp[6] << '\t' << desrcElementsTmp[7] << '\t' << desrcElementsTmp[8] << '\t' << desrcElementsTmp[9] << '\t' << desrcElementsTmp[10] << '\t' <<endl; //cout << endl; sp_mat X(1, centersNum); X.zeros(); for (int j = 0; j < descrNums[i]; j++){ X(0, desrcElementsTmp[j]-1) += 1; } X.print("X:"); X = X/norm(X, 2); Hist.row(i) = X; count = count + descrNums[i]; delete desrcElementsTmp; } //Hist.print("Hist:");

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 72
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王不头秃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值