这是以前做的小项目里的一部分,由于时间久远,在这里整理以下,也方便自己以后查阅。

前期准备

ZED-stereo是很好用功能强大的双目相机,可以调用自带的库直接读取点云数据,也可以很方便获得图像任意一点距离相机的深度。这里使用基于颜色的识别方法来检测物体。
首先贴一段我忘记从哪里找来的非常好用的代码。

import cv2
import numpy as npdef nothing(x):passcap = cv2.VideoCapture(1)
cv2.namedWindow("Trackbars")cv2.createTrackbar("L - H", "Trackbars", 0, 179, nothing)
cv2.createTrackbar("L - S", "Trackbars", 0, 255, nothing)
cv2.createTrackbar("L - V", "Trackbars", 0, 255, nothing)
cv2.createTrackbar("U - H", "Trackbars", 179, 179, nothing)
cv2.createTrackbar("U - S", "Trackbars", 255, 255, nothing)
cv2.createTrackbar("U - V", "Trackbars", 255, 255, nothing)while True:_, frame = cap.read()hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)l_h = cv2.getTrackbarPos("L - H", "Trackbars")l_s = cv2.getTrackbarPos("L - S", "Trackbars")l_v = cv2.getTrackbarPos("L - V", "Trackbars")u_h = cv2.getTrackbarPos("U - H", "Trackbars")u_s = cv2.getTrackbarPos("U - S", "Trackbars")u_v = cv2.getTrackbarPos("U - V", "Trackbars")lower_blue = np.array([l_h, l_s, l_v])upper_blue = np.array([u_h, u_s, u_v])mask = cv2.inRange(hsv, lower_blue, upper_blue)result = cv2.bitwise_and(frame, frame, mask=mask)cv2.imshow("frame", frame)cv2.imshow("mask", mask)cv2.imshow("result", result)key = cv2.waitKey(1)if key == 27:breakcap.release()
cv2.destroyAllWindows()

这段代码生成三个可以调节的滑动条,可以很直观方便的调节HSV的上下限,随便拖动知道图像中只剩下你想要检测的物体。有时候如果有光班之类的没有关系,因为后期会使用开闭和操作。
然后开始检测的主要部分。

import pyzed.camera as zcam
import pyzed.defines as sl
import pyzed.types as tp
import pyzed.core as core
import math
import numpy as np
import sys
import cv2
#这里的数据就是之前的代码得到的HSV的上下限
lower_blue = np.array([0,122 ,130])
upper_blue = np.array([152, 255, 243])
font = cv2.FONT_HERSHEY_SIMPLEX
#调用ZED的代码
def main():print("Running...")init = zcam.PyInitParameters()zed = zcam.PyZEDCamera()if not zed.is_opened():print("Opening ZED Camera...")status = zed.open(init)if status != tp.PyERROR_CODE.PySUCCESS:print(repr(status))exit()runtime = zcam.PyRuntimeParameters()mat = core.PyMat()init_params = zcam.PyInitParameters()init_params.depth_mode = sl.PyDEPTH_MODE.PyDEPTH_MODE_PERFORMANCE  # Use PERFORMANCE depth modeinit_params.coordinate_units = sl.PyUNIT.PyUNIT_MILLIMETER  # Use milliliter units (for depth measurements)image = core.PyMat()depth = core.PyMat()point_cloud = core.PyMat()key = ''while key != 113:  # for 'q' keyerr = zed.grab(runtime)if err == tp.PyERROR_CODE.PySUCCESS:zed.retrieve_image(mat, sl.PyVIEW.PyVIEW_LEFT)zed.retrieve_measure(depth, sl.PyMEASURE.PyMEASURE_DEPTH)zed.retrieve_measure(point_cloud, sl.PyMEASURE.PyMEASURE_XYZRGBA)#time t1t1 = cv2.getTickCount()#thresholdframe = mat.get_data()#因为ZED是双目相机,这里只使用左侧相机的图像检测物体frame = cv2.resize(frame, (int(mat.get_width()/2),int(mat.get_height()/2)),interpolation=cv2.INTER_AREA)#基于颜色的目标识别hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)mask = cv2.inRange(hsv, lower_blue, upper_blue)result = cv2.bitwise_and(frame, frame, mask=mask)#cv2.imshow("result",result)#result = cv2.cvtColor(result, cv2.COLOR_HSV2BGR)result = cv2.cvtColor(result, cv2.COLOR_BGR2GRAY)blurred = cv2.blur(mask, (5,5))(_,threshold) = cv2.threshold(blurred,5,255, cv2.THRESH_BINARY)(_,cnts,h) = cv2.findContours(threshold.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)#cv2.imshow("threshold", threshold)#morphologykernel = cv2.getStructuringElement(cv2.MORPH_RECT,(50,50))closing = cv2.morphologyEx(threshold,cv2.MORPH_CLOSE,kernel)closed = cv2.erode(closing, None, iterations=4)closed = cv2.dilate(closed, None, iterations=4)# findcontours(_,cnts,h) = cv2.findContours(closed.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)if len(cnts) > 0:c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]rect= cv2.minAreaRect(c)box=cv2.boxPoints(rect)box=np.int0(box)cv2.drawContours(frame,[box],-1,(0,255,0),3)#get the coordinate of the contours#计算目标框的坐标以及中心点Xs = [i[0] for i in box]Ys = [i[1] for i in box]x1 = min(Xs)x2 = max(Xs)y1 = min(Ys)y2 = max(Ys)#distancex = round(x1+x2)y = round(y1+y2) #获取中心点的点云数据并计算距离err, point_cloud_value = point_cloud.get_value(x, y)distance = math.sqrt(point_cloud_value[0] * point_cloud_value[0] +point_cloud_value[1] * point_cloud_value[1] +point_cloud_value[2] * point_cloud_value[2])t2 = cv2.getTickCount()if not np.isnan(distance) and not np.isinf(distance):distance = round(distance)print("Distance to Camera at ({0}, {1}): {2} mm\n".format(x, y, distance))#time t2# Increment the loopelse:print("Can't estimate distance at this position, move the camera\n")sys.stdout.flush()t = (t2-t1)/cv2.getTickFrequency()FPS = 1/tfps = "Camera FPS: {0}.".format(FPS)cv2.putText(frame,fps,(50,50),font,0.5,(255,255,255),2,cv2.LINE_AA)Z = "Distance: {} mm".format(distance)cv2.putText(frame,Z,(x2,y2), font, 0.7,(255,255,255),2,cv2.LINE_AA)cv2.imshow("ZED", frame)key = cv2.waitKey(5)else:key = cv2.waitKey(5)cv2.destroyAllWindows()zed.close()print("\nFINISH")if __name__ == "__main__":main()

识别的结果大概如下:
还有一小段视频是代码运行的样子。
B站视频

总结一下

颜色识别永远好用,只要它具备识别条件就不会出错(虽然大部分自然条件下很难)。
感谢trackbar.py 的作者,虽然我忘记我从来看到的这段代码,但是你的恩情我一直会记得的。

使用ZED相机识别颜色醒目的水壶并计算与相机的距离相关推荐

  1. Python:OpenCV4识别一个蓝色的圆并估算到相机的距离

    Python:OpenCV4识别一个蓝色的圆并估算到相机的距离 参考:用 Python 和 OpenCV 来测量相机到目标的距离 这位博主对实现过程以及思路解释的很清楚,这里记录下自己的实现过程以及自 ...

  2. 2021-01-07 python opencv实现车牌识别 颜色定位

    python opencv实现车牌识别 颜色定位 主要代码参考https://blog.csdn.net/wzh191920/article/details/79589506 GitHub:https ...

  3. 机器学习识别颜色_使用机器学习为颜色命名

    机器学习识别颜色 在最近去密歇根州的旅行中,我的朋友蒂姆·索萨 ( Tim Sosa)提到了他读过的一篇博客文章 ,作者詹妮尔·沙恩(Janelle Shane)描述了她如何建立一个神经网络,该网络从 ...

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

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

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

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

  6. python识别颜色并提取轮廓_pythonopencv检测并提取目标颜色

    这次给大家带来python opencv检测并提取目标颜色,python opencv检测并提取目标颜色的注意事项有哪些,下面就是实战案例,一起来看一下. 实例如下所示:# -*- coding:ut ...

  7. OPenMV识别颜色识别物块及检测二维码的进阶应用

    OPenMV摄像头入门与识别颜色物块及二维码的进阶应用 OpenMV简介 简单的来说,它是一个可编程的摄像头,通过MicroPython语言,可以实现你的逻辑. 而且摄像头本身内置了一些图像处理算法, ...

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

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

  9. 【Python+OpenCV】识别颜色方块并提取轮廓

    前一阵在做机械臂下井字棋的综合设计,在网上直接购买了一套机械臂装置(包括机械臂,摄像头,树莓派,花费1600元),机械臂不是很高级.精度很低.源码里提供识别红绿蓝三种颜色方块的识别和抓取. 经过多次尝 ...

最新文章

  1. 2017年前端工作小结,个人踩坑之旅,前端学习者的杂谈
  2. 论文浅尝 | Data Intelligence 已出版的知识图谱主题论文
  3. 随想系列_4_从电影《可可西里》说起
  4. sparksql优化_Spark SQL | 目前Spark社区最活跃的组件之一
  5. [80386]80x86汇编指令
  6. [#32;] 在wordpress [the_excerpt()] 函数执行的妙用
  7. java话费充值代码_话费充值接口示例代码
  8. 计算机PPT在哪打开,电脑自带ppt在哪
  9. 详解:什么是NVMe?
  10. 阿里云大数据分析师(ACP)认证,该如何备考?
  11. STL笔记:rb_tree
  12. oracle 11g用户名密码区分大小写
  13. 什么是“托管代码”?
  14. 开启win10下Ubuntu子系统的SSH服务
  15. 2021年金属非金属矿山安全检查(露天矿山)考试技巧及模拟考试题
  16. Esri-Geometry-Api-Java 笔记
  17. 数据结构——冒泡排序
  18. Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException
  19. vb2010中ComboBox的item用法
  20. 青柠启动v1.0发布

热门文章

  1. 录音转文字,怎么把手机录音转文字
  2. 网络字节序和主机字节序
  3. A Survey for Image Quality Assessment(综述)
  4. php如何实现会员推荐奖励,分享微信公众号实现会员卡领取的功能
  5. 通过SQL语句实现搜索附近的人
  6. web实例之电子日历
  7. python时间戳是什么意思_Python返回5位数的时间戳,这是什么?
  8. HTML学生个人网站作业设计:明星介绍网站制作——刘德华(11页) HTML+CSS+JavaScript 简单DIV布局明星人物介绍网页模板代码 DW学生个人网站制作成品下载
  9. 【已解决】Windows更新:你的设备中缺少重要的安全和质量修复(电脑自动更新帮我解决的,文中的方法我之前试过没用)
  10. 图数据库技术选型汇总