第1步:获取到桌球台的图像信息

需要获取桌面固定区域的实时图像(这里为了方便,直接截取了一张图片)

第2步:识别出球杆和白球

创建滑条from cv2 import cv2

import numpy as np

def empty(a):

pass

cv2.namedWindow("TarckBars")

cv2.resizeWindow("TarckBars",640,240)

cv2.createTrackbar("Hue Min", "TarckBars", 0, 180, empty)

cv2.createTrackbar("Hue Max", "TarckBars", 180, 180, empty)

cv2.createTrackbar("Sat Min", "TarckBars", 0, 255, empty)

cv2.createTrackbar("Sat Max", "TarckBars", 255, 255, empty)

cv2.createTrackbar("Lig Min", "TarckBars", 0, 255, empty)

cv2.createTrackbar("Lig Max", "TarckBars", 255, 255, empty)

导入我们的图片img = cv2.imread(图片路径)

#将图片的颜色空间转换到HSV

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

通过读取滑条数值调整颜色区间while True:

h_min = cv2.getTrackbarPos("Hue Min","TarckBars")

h_max = cv2.getTrackbarPos("Hue Max","TarckBars")

s_min = cv2.getTrackbarPos("Sat Min","TarckBars")

s_max = cv2.getTrackbarPos("Sat Max","TarckBars")

v_min = cv2.getTrackbarPos("Lig Min","TarckBars")

v_max = cv2.getTrackbarPos("Lig Max","TarckBars")

#颜色区间 [lower ~ upper]

lower = np.array([h_min,s_min,v_min])

upper = np.array([h_max,s_max,v_max])

#分割出颜色区间

mask = cv2.inRange(hsv, lower, upper)

res = cv2.bitwise_and(img, img, mask= mask)

#显示

cv2.imshow("img_mask", mask)

cv2.imshow("img_res", res)

cv2.waitKey(1)

然后我们拖动滑条,慢慢找到阈值

颜色区间[0,0,221] — [180,30,255] 这个是白球的

[11,74,137] — [75,100,255] 这个是球杆的

但是我们发现,图像上还有很多白点(其他球中间的白色/和球杆颜色差不多), 所以我们要排除它们def getBallArm(imgHSV):

lowerb =np.array([11, 74, 137])

upperb =np.array([75, 100, 255])

mask = cv2.inRange(imgHSV, lowerb, upperb)

#提取轮廓

conts, hier = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

xs, ys, ws, hs = 0,0,0,9999

for cnt in conts:

area = cv2.contourArea(cnt)

#看图,我们发现球杆比其他噪点的面积都大

#所以我们判断面积小于50的,我们就排除

if area > 50:

peri = cv2.arcLength(cnt, True)

approx = cv2.approxPolyDP(cnt, 0.02*peri, True)

x, y, w, h = cv2.boundingRect(approx)

#看图,球杆识别出来有两段,我们只需要球杆顶部

#所以我们判断 水平方向时: 高度小的是顶部

# 垂直方向时: 宽度小的是顶部

#这里只写了水平方向时,需要的可以自己加

if h < hs:

xs, ys, ws, hs = x,y,w,h

#这里判断了球杆是否垂直

if ws > hs:

cv2.putText(img, "level", (xs + (ws//2 - 10), ys + (hs//2 - 10)), cv2.FONT_HERSHEY_COMPLEX, cv2.CHAIN_APPROX_SIMPLE, (0,255,0),2)

cv2.rectangle(img, (xs,ys), (xs+ws,ys+hs), (255,0,255), 1)

return xs, ys, ws, hsdef getWhiteBall(imgHSV):

lowerb =np.array([0, 0, 221])

upperb =np.array([180, 30, 255])

mask = cv2.inRange(imgHSV, lowerb, upperb)

#提取轮廓

conts, hier = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

x,y,w,h = 0,0,0,0

for cnt in conts:

area = cv2.contourArea(cnt)

#同上,通过面积去除噪点

if area > 100 and area < 180:

peri = cv2.arcLength(cnt, True)

approx = cv2.approxPolyDP(cnt, 0.02*peri, True)

x, y, w, h = cv2.boundingRect(approx)

cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,255), 2)

return x,y,w,h

通过上面两个函数,我们就可以识别出球杆和白球了,并且我们也知道了它们的位置

第3步:绘制出球杆的辅助线

这里需要导入mathimport math

我们准备下面函数来对坐标进行归一化def normalize(vx, vy):

length = math.sqrt(vx * vx + vy * vy)

return vx / length, vy / length

向一个方向向量延长dis距离def extend(v1, v2, dis):

norx, nory = normalize(v2[0] - v1[0], v2[1] - v1[1])

px = v1[0] + dis * norx

py = v1[1] + dis * nory

return math.ceil(px), math.ceil(py)

获取白球和球杆的x y w hballX, ballY, ballW, ballH = getWhiteBall(imgHSV)

armX, armY, armW, armH = getBallArm(imgHSV)#计算白球的中心点

ballCentX, ballCentY = ballX, ballY + (ballH / 2.0)

#计算球杆顶部的中心点

armCentX, armCentY = armX + armW, armY + (armH / 2.0)

画出辅助线px,py = extend((armX, armCentY), (armCentX, armCentY), 500)

#画出辅助线

cv2.line(img, (armX, math.ceil(armCentY)), (px, py), (0, 0, 0), 2)

#显示

cv2.imshow('img', img)

cv2.waitKey(0)

看效果

android opencv颜色识别,OpenCV学习——颜色识别的简单应用(一)相关推荐

  1. 老鼠识别 yolo老鼠识别 深度学习老鼠识别 仓鼠识别 名厨亮灶

    自建数据集训练的模型 效果棒棒哒 深度学习算法 yolov3训练 keras版本 tf版本 c++版本 效果如下

  2. opencv 运动追踪_足球运动员追踪-使用OpenCV根据运动员的球衣颜色识别运动员的球队

    opencv 运动追踪 介绍 (Introduction) In my previous work, I used pre-trained Yolov3 model to detect and use ...

  3. 颜色识别opencv+trackbar调节目标颜色hsv的阈值

    颜色识别opencv+trackbar调节目标颜色hsv的阈值 颜色识别,trackbar调节颜色阈值 #include <iostream> #include "opencv2 ...

  4. java识别图片中的图形形状_基于Java+OpenCV技术对几何图像颜色与形状识别

    基于 Java+OpenCV 技术对几何图像颜色与形状识别 杨思阳 黄军 吴春秋 (黔东南民族职业技术学院,贵州 凯里 556000) [摘 要] 通过 Java 调用 OpenCV 视觉库实现几何图 ...

  5. OpenCV颜色识别(所有颜色均可识别)

    OpenCV颜色识别实例(所有颜色均可识别) 本文中的颜色识别为红色,颜色阈值设置如下: lower_apple = np.array([0, 100, 100]) higher_apple = np ...

  6. 使用OpenCV中的分类器和颜色识别的苹果位置识别

    使用OpenCV中的分类器和颜色识别的苹果位置识别 环境配置和安装 拍摄并处理样本 生成正样本的描述文件pos.vec 开始训练分类器 单目测距 完成分类器与颜色识别,轮廓提取算法的结合 运行结果图片 ...

  7. 深入学习OpenCV文档扫描OCR识别及答题卡识别判卷(文档扫描,图像矫正,透视变换,OCR识别)

    人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力.FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台.每周免费提供 ...

  8. 学习Opencv+Python之银行卡卡号识别

    学习Opencv+Python之银行卡卡号识别 思路: 获取模板轮廓 获取模板中每个数字的轮廓 获取银行卡卡号轮廓 分别提取卡号中的每个数字的轮廓 对比识别 代码: # 导入工具包 from imut ...

  9. 【OpenCV图像处理入门学习教程六】基于Python的网络爬虫与OpenCV扩展库中的人脸识别算法比较

    OpenCV图像处理入门学习教程系列,上一篇第五篇:基于背景差分法的视频目标运动侦测 一.网络爬虫简介(Python3) 网络爬虫,大家应该不陌生了.接下来援引一些Jack-Cui在专栏<Pyt ...

  10. python dlib opencv人脸识别准确度_Dlib+OpenCV深度学习人脸识别的方法示例

    前言 人脸识别在LWF(Labeled Faces in the Wild)数据集上人脸识别率现在已经99.7%以上,这个识别率确实非常高了,但是真实的环境中的准确率有多少呢?我没有这方面的数据,但是 ...

最新文章

  1. soalris小記...
  2. java 泛型调用方法调用_java – 如何使用泛型调用最具体的方法?
  3. Html与JS正则表达式测试代码
  4. HTML5是不是解决跨平台问题的终极密钥
  5. 快速解决数据库连接失败
  6. The conda.compat module is deprecated and will be removed in a future releas错误记录
  7. android 基带版本,手机基带是什么?手机的基带版本是什么意思?
  8. Java汉字转拼音(简繁体转换)库之JPinYin
  9. TensorFlow练习13: 制作一个简单的聊天机器人
  10. Robot Framework(三):RIDE工具简介
  11. hive创建hbase外部表
  12. 字节流与字符流(一)
  13. excel自动排班表_Excel数据分析-如何制作自动更新的数据透视表
  14. windows进注册表快捷键
  15. 用单链表的方式实现集合的基本运算(数据结构C语言版)
  16. Windows 源码运行 ThingsBoard
  17. 数学建模论文基本格式(转载)
  18. Html文本学习内容-2
  19. 网格设计版式设计_8点网格:Web上的版式
  20. B样条曲线——de Boor递推算法实现

热门文章

  1. 解决opencv——python下载过慢的问题
  2. 申请白金汉大学:国际学生的最佳选择!
  3. 网络编程基础一:TCP/IP 协议详解
  4. 常见linux系统命令大全
  5. Oracle 各版本客户端下载地址,持续收集中
  6. 搭建企业内部Discuz网页论坛,并内网穿透实现公网访问
  7. 2021/4/24团队设计天梯赛L3题目集及部分题解
  8. Python编程 while循环
  9. 基于H5跳转APP,未安装的话就跳转appstore
  10. 手把手教你,嘴对嘴传达------Apache网页优化