先叠个甲(作者寒假才开始自学opencv,做题练手,还不是很熟练,如果有不正确或者有更好的方法,欢迎在评论区指出)

题目:从网上寻找任一魔方图片,识别其中白色色块,描绘并输出其中所有白色色块的中心点坐标(也可选择其他颜色,代码有变化,后续指出)


首先我们要知道大致的流程有哪些,本文章以识别白色块为例,以下是重点步骤:

后面也有完整代码

  1. 成功读取魔方图片

# 读入图片,还可以将其
import cv2 as cv
import numpy as np
img = cv.imread('./test1.jpg')
  1. 获取白色部分,并输出它的二值图:

这里我使用的是cv.inRange()函数,cv2.inRange 的作用是根据阈值进行二值化:阈值内的像素设置为白色 (255),阈值外的设置为黑色 (0) mask = cv2.inRange(hsv, lower, upper), 通过这个性质,设置阈值使白色以外的区域变黑。但使用时需要用HSV图像,所以要提前转换,通过HSV=cv.cvtColor(img,cv.COLOR_BGR2HSV)。

这里推荐:

【youcans 的 OpenCV 例程300篇】209. HSV 颜色空间的彩色图像分割 这个博主有详细介绍,不过我们知道阈值就行,图片也是截取该文章

#最低阈值 lowercolor = np.array([Hmin, Smin, Vmin])
#最高阈值 uppercolor = np.array([Hmax, Smax, Vmax])
# 根据要保留的颜色设置阈值。该阈值内的像素会变成白色,其余为黑色HSV=cv.cvtColor(img,cv.COLOR_BGR2HSV)    #转换图像
lowerColor = np.array([0,0,211])        #设置最低阈值
upperColor = np.array([180,30,255])     #设置最高阈值# 因为要保留的就是白色区域,因此根据白色阈值填入

(1)使用inRange函数,传入设置好的lowercolor和uppercolor

提取白色部分(指定区域变白,其他变黑)
binary = cv.inRange(HSV, lowerColor,upperColor)

(2)得到的图像还是有很多残缺的地方,因此需要选择合适的方法去噪声,让图像更好看,这里我选择的是中值滤波。使用完后显示图片。

# 运用中值滤波去除噪声
median = cv.medianBlur(binary, 9)
# 显示二值图
cv_show('median',median) # 这里是我自己写的cv_show()函数,函数声明可放开头# def cv_show(name, img):#cv.imshow('name', img)#cv.waitKey(0)#cv.destroyAllWindows()

(3)结果:

  1. 将白色方块的轮廓在原图显示

这里使用轮廓检测cv2.findContours()的方法,并且返回contours轮廓信息,以及hierachy层级(这里用不到)。再将轮廓信息contours传入cv2.drawContours()在原图画出。我们可以使其显示。

contours, hierachy = cv.findContours(median, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
#后两个为轮廓检索模式和轮廓逼近模式res = cv.drawContours(img, contours, -1,(0,0,255), 4)
cv_show('res', res)

结果:

  1. 在原图中描绘物体中心点并输出坐标

运用了cv2.minEnclosingCircle(cnt)函数得中心点,cv2.circle()标出圆心。

这里可以把中心的点理解为半径特别小的圆因此就可以用cv.circle()函数

# 4、原图白色中心点
L = len(contours)     # contours轮廓数据是数组,因此用len()测数组长度,为了循环画点使用for i in range(L):cnt = contours[i]    # cnt表示第i个白色快的轮廓信息(x,y), radius = cv.minEnclosingCircle(cnt) # 得到白色块外接圆的圆心坐标和半径center = (int(x),int(y))   # 画center圆心时。x,y必须是整数# 标出中心点img2 = cv.circle(img, center,3,(0,0,255),5) # 传入圆心信息,并画在原图上print(center) # 输出各个中心点# 显示有中心点的图像
cv_show("frame",img2)    # 展示花了中心点的魔方图

结果:

到此,题目全部完成。


完整代码:

import cv2 as cv
import numpy as np# 写一个显示函数
def cv_show(name, img):cv.imshow(name, img)cv.waitKey(0)cv.destroyAllWindows()# 1、读取图片并显示
img = cv.imread('./test1.jpg')
cv_show('img', img)# 2、输出白色色块的二值图并显示
# 转化为HSV进行处理
HSV=cv.cvtColor(img,cv.COLOR_BGR2HSV)
lowerColor = np.array([0,0,211])
upperColor = np.array([180,30,255])# 提取白色部分(指定区域变白,其他变黑)
binary = cv.inRange(HSV, lowerColor,upperColor)# 运用中值滤波去除噪声
median = cv.medianBlur(binary, 9)# 显示二值图
cv_show('median',median)# 3、得到轮廓,并在原图输出
contours, hierachy = cv.findContours(median, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
res = cv.drawContours(img, contours, -1,(0,0,255), 4)
cv_show('res', res)# 4、原图白色中心点
L = len(contours)    # contours轮廓数据是数组,因此用len()测数组长度,为了循环画点使用
print("coordinate:")
for i in range(L):cnt = contours[i]    # cnt表示第i个白色快的轮廓信息(x,y), radius = cv2.minEnclosingCircle(cnt) # 得到白色块外接圆的圆心坐标和半径center = (int(x),int(y))   # 画center圆心时。x,y必须是整数# 标出中心点img2 = cv2.circle(img, center,3,(0,0,255),5) # 传入圆心信息,并画在原图上print(center) # 输出各个中心点# 显示有中心点的图像
cv_show("img2",img2)    # 展示花了中心点的魔方图

“向着群月亮出发,即使不能到达,也能站在群星之中”

opencv-python识别魔方特定颜色方块,并输出各方块中心坐标相关推荐

  1. python如何实现图像中特定颜色的种类识别及特定颜色的占比代码

    使用Python实现图像中特定颜色的种类识别及特定颜色的占比代码,首先可以使用OpenCV库对图像进行处理,然后使用特定的函数来识别图像中特定颜色的种类,最后使用统计学方法来计算特定颜色在图像中的占比 ...

  2. python识别魔方色块_【雕爷学编程】MicroPython动手做(08)——零基础学MaixPy之识别颜色...

    早上用百度搜了一下"颜色识别",多少有了一点大致的概念,还是老办法,动手做,多实验,往前走,还请各位老师多多指点. OpenCV(百度百科) 是一个基于BSD许可(开源)发行的跨平 ...

  3. opencv python 识别视频水印_opencv+python实现视频实时质心读取

    利用opencv+python实现以下功能: 1)获取实时视频,分解帧频: 2)将视频做二值化处理: 3) 将视频做滤波处理(去除噪点,获取准确轮廓个数): 4)识别图像轮廓: 5)计算质心: 6)描 ...

  4. python识别魔方色块_解魔方的机器人攻略23 – 识别颜色(上)

    今天看到架子上的萝卜头,已经落了很多灰尘.想起萝卜头的攻略还剩几篇迟迟没有写完.前一段时间一直在试验小爱的手机遥控器功能,从今天开始准备陆续把萝卜头的攻略补完,给博客也打扫打扫灰尘. 说起来真是很惭愧 ...

  5. python识别魔方色块_解魔方机器人教程:识别颜色

    1,从NXT发送颜色数据到电脑 在//Send colors to PC public static void SendColorToPC(int center, int n) throws Exce ...

  6. OpenCV+Python识别车牌和字符分割

    本篇文章主要基于python语言和OpenCV库(cv2)进行车牌区域识别和字符分割,开篇之前针对在python中安装opencv的环境这里不做介绍,可以自行安装配置! 车牌号检测需要大致分为四个部分 ...

  7. 使用opencv+python识别七段数码显示器的数字识别

    # 导入必要的包 from imutils.perspective import four_point_transform from imutils import contours import im ...

  8. 项目记录一:用Python识别图片中指定颜色标记块并绘制其最小矩形框以及坐标点

    记录准研一小白第一次动手实践课题组师姐安排的任务,非常感谢CSDN前辈们所撰写的博客对我的帮助. 一.项目背景 如图所示,有这样一张现场勘测的图片,要实现绘制出图中三个黄色标记块的最小矩形框以及左上角 ...

  9. opencv+python识别猪

    背景:在车载监控回传的视频里判断该车里是否有猪 解决思路:在回传视频里做物体识别,如果有猪就框出来并且给出一个代表值 day1 2021-10-27 设想:物体识别,并且在图中框出来猪 1.找正样本 ...

最新文章

  1. HTTP 2.0与HTTP 1.0的区别 ?
  2. step1 . day6 C语言基础练习之数组和字符串
  3. 软件工程 --第七章 -- 实现(未完)
  4. HTML/CSS/JavaScript学习总结(转)
  5. vagrant使用centos的环境安装..
  6. c语言float转换为int_C语言的隐式类型转换和显示类型转换
  7. django 正则捕捉路径 re_path函数
  8. 电脑编程学习_零基础到底是否可以学习电脑编程?答案扎心了!
  9. vue无法监听对象的属性的增加和删除
  10. .net ajax 保存文件,.net ajax式上传文件
  11. CentOS7下EasyDarwin的安装搭建
  12. java实现来电弹屏_客服系统如何实现1秒来电弹屏?
  13. 离散数学中Warshall算法简析
  14. 深度学习——UMRL
  15. vue跳转新页面链接以及url 转码
  16. 【新知实验室TRTC】
  17. DPDK-IP分片和重组库
  18. [第一讲]DSP28335将Flash中的代码拷贝到RAM中运行
  19. 用酒精Alcohol 120%刻WI-IC的OS简单教程
  20. MATLAB基础篇——数值分析篇

热门文章

  1. 优秀的 Verilog/FPGA开源网站介绍
  2. python 3.5 urllib
  3. sift论文_从十篇热门学术论文看计算机视觉的未来
  4. qsort函数的使用
  5. 蓝队工具:使用VirusTotal API校验样本
  6. 你好你好你好你好你好你好你好你好
  7. 关于华为实习的一两点感触
  8. 华为运营商级路由器配置示例 | 配置VPLS over TE示例(LDP方式)
  9. UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xbb in position 0: invalid start byte
  10. DNS?本地填写的DNS有什么用?DNS怎么工作的?