一. 提取颜色

⭐运用的知识:
视频处理、滚动条、HSV色彩空间、标记指定颜色

通过滚动条调整HSV图像三个通道的取值范围,提取画笔的颜色。

import cv2
import numpy as npframeWidth = 640
frameHeight = 480
cap = cv2.VideoCapture(0)
cap.set(3, frameWidth)
cap.set(4, frameHeight)def empty(a):passcv2.namedWindow("HSV")
cv2.resizeWindow("HSV", 640, 240)
cv2.createTrackbar("HUE Min", "HSV", 0, 179, empty)
cv2.createTrackbar("HUE Max", "HSV", 179, 179, empty)
cv2.createTrackbar("SAT Min", "HSV", 0, 255, empty)
cv2.createTrackbar("SAT Max", "HSV", 255, 255, empty)
cv2.createTrackbar("VALUE Min", "HSV", 0, 255, empty)
cv2.createTrackbar("VALUE Max", "HSV", 255, 255, empty)while True:success, img = cap.read()imgHsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)h_min = cv2.getTrackbarPos("HUE Min", "HSV")h_max = cv2.getTrackbarPos("HUE Max", "HSV")s_min = cv2.getTrackbarPos("SAT Min", "HSV")s_max = cv2.getTrackbarPos("SAT Max", "HSV")v_min = cv2.getTrackbarPos("VALUE Min", "HSV")v_max = cv2.getTrackbarPos("VALUE Max", "HSV")print(h_min)lower = np.array([h_min, s_min, v_min])upper = np.array([h_max, s_max, v_max])mask = cv2.inRange(imgHsv, lower, upper)result = cv2.bitwise_and(img, img, mask=mask)mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)hStack = np.hstack([img, mask, result])cv2.imshow('Horizontal Stacking', hStack)c = cv2.waitKey(25)if c==27: breakcap.release()
cv2.destroyAllWindows()

二. 虚拟画笔实现

⭐用到的知识(除了上一步用到的知识):
逼近多边形、图像轮廓、图形绘制

在myColors列表中写入上一步中得到的HSV的范围(可以写任意多个),在myColorValues列表中写入画笔颜色对应的RGB(列表长度与myColors一致)。

import cv2
import numpy as np
frameWidth = 640
frameHeight = 480
cap = cv2.VideoCapture(0)
cap.set(3, frameWidth)
cap.set(4, frameHeight)
cap.set(10,150)myColors = [[76,71,191,93,255,255]] #H_low,S_low,V_low,H_high,S_high,V_high,可以放任意多个颜色
myColorValues = [[51,153,255]]        ## 绘制圆圈的颜色myPoints =  []  ## [x , y , colorId ]# 查抄轮廓
def findColor(img,myColors,myColorValues):imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)count = 0newPoints=[]for color in myColors:lower = np.array(color[0:3])upper = np.array(color[3:6])mask = cv2.inRange(imgHSV,lower,upper)x,y=getContours(mask)cv2.circle(imgResult,(x,y),15,myColorValues[count],cv2.FILLED)if x!=0 and y!=0:newPoints.append([x,y,count])count +=1cv2.imshow(str(color[0]),mask)return newPoints#获取笔尖坐标
def getContours(img):image, contours, hierarchy = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)x,y,w,h = 0,0,0,0for cnt in contours:area = cv2.contourArea(cnt)if area>500:#cv2.drawContours(imgResult, cnt, -1, (255, 0, 0), 3)peri = cv2.arcLength(cnt,True)approx = cv2.approxPolyDP(cnt,0.02*peri,True)x, y, w, h = cv2.boundingRect(approx)return x+w//2,y#绘制轮廓
def drawOnCanvas(myPoints,myColorValues):for point in myPoints:cv2.circle(imgResult, (point[0], point[1]), 10, myColorValues[point[2]], cv2.FILLED)while True:success, img = cap.read()imgResult = img.copy()newPoints = findColor(img, myColors,myColorValues)if len(newPoints)!=0:for newP in newPoints:myPoints.append(newP)if len(myPoints)!=0:drawOnCanvas(myPoints,myColorValues)cv2.imshow("Result", imgResult)c = cv2.waitKey(25)if c==32: #空格清屏myPoints = []if c==27: #esc退出breakcap.release()
cv2.destroyAllWindows()

OpenCV项目实战——虚拟画笔相关推荐

  1. [开源] C语言项目实战 - 虚拟鼠标 - VirtualMouse

    C语言项目实战 - 虚拟鼠标 - VirtualMouse 目录 关于软件 软件介绍 使用帮助 项目介绍 源码及软件下载 知识点扫描 热键的使用 鼠标事件的模拟 字体的选用 开机自启动的设置 为软件添 ...

  2. 【Opencv项目实战】背景替换:动态背景移除与替换(cvzone+MediaPipe)

    文章目录 一.项目思路 二.环境布置 2.1.cvzone安装 2.2.MediaPipe安装 2.3.常见问题 2.4.注意事项 三.算法详解 3.1.segmentor.removeBG():去除 ...

  3. Opencv项目实战-信用卡数字识别

    Opencv项目实战:信用卡数字识别 导入库,定义展示函数 import cv2 import numpy as np from imutils import contours import myut ...

  4. 基于C++的OpenCV项目实战——文档照片转换成扫描文件

    基于C++的OpenCV项目实战--文档照片转换成扫描文件 一.背景 前段时间都是基于Python的OpecCV进行一些学习和实践,但小的知识点并没有应用到实际的项目中:并且基于Python的版本的移 ...

  5. Opencv项目实战:14 手势控制音量

    目录 0.项目介绍 1.项目展示 2.项目搭建 3.项目的代码与讲解 4.项目资源 5.项目总结 0.项目介绍 本篇与上一篇有很多联系,大家可以看看这篇Opencv项目实战:13 手部追踪,我们将根据 ...

  6. 【Opencv项目实战】目标追踪:实时追踪人工标注的多个目标

    文章目录 一.项目思路 二.问题清单 三.算法详解 3.1.定义目标追踪算法 3.2.初始化追踪器 3.3.更新目标追踪器 3.4.绘制目标矩形框 3.5.人工标注感兴趣目标 3.5.1.标注ROI区 ...

  7. Opencv项目实战:基于dlib的疲劳检测

    文章目录 一.项目简介 二.算法原理 三.环境配置 3.1.dlib人脸检测器:dlib.get_frontal_face_detector() 3.2.dlib关键点定位工具:shape_predi ...

  8. Opencv项目实战:15 手势缩放图片

    目录 0.项目介绍 1.项目展示 2.项目搭建 3.项目的代码与讲解 4.项目资源 5.项目总结 0.项目介绍 本篇将会以HandTrackingModule为模块,这里的模块与之前的有所不同,请按照 ...

  9. Opencv项目实战之信用卡识别

    任务要求 学了这么久opencv,不做个实战项目怎么行(手动狗头)

最新文章

  1. RabbitMQ错误检查
  2. 从容稳进,高通正扎实推进5G
  3. 【Tools】MarkDown教程(六)-Markdown Reference
  4. 编译选项—微软官方+各地总结
  5. idea for mac 控制台 mvn command not found
  6. python wheel使用_Python wheel.Wheel方法代碼示例
  7. 猛料来啦!Autodesk全线产品二次开发视频录像下载!!
  8. 应用程序初次运行数据库配置小程序(Java版)
  9. Json Datable Convert
  10. form表单提交数据的同时上传文件代码示例
  11. 动态列从一表的数据汇总至另外一张表中
  12. jQuery操作动画队列
  13. Ubuntu解决包依赖关系
  14. Java序谈之通讯录制作
  15. JAVA各种系统架构图及其简介,分布式中间件技术实战
  16. ROS-3DSLAM(十四)lvi-sam源代码阅读12 —— visual_loop阅读5
  17. pygame简易超级玛丽制作
  18. C语言实现画爱心(两种方式画法)
  19. 用浅浅的幸福交换落寞的伤
  20. js仿google+分享新鲜事系统实例源码

热门文章

  1. 习题 5.12 编写一程序,将两个字符串连接起来,结果取代第一个字符串。
  2. Decide.com进军团购业务并推“退差价计划”
  3. 搜狗收录查询-搜狗排名查询
  4. 2021-08-10第一章绪论1.1统计学与医学统计学
  5. 【LEDE】x86软路由之路-04-哑巴?alsa了解一下?
  6. 趋势科技发布《2007年病毒威胁报告暨2008年预测》
  7. 一男老师每日百词转载+连载(4)
  8. java公众号订单查询
  9. 熊掌号 php提交,网站接入熊掌号,网页配置并提交
  10. Image.FromStream与Image.FromFile使用区别