「完结撒花」使用intel realsense D435i深度相机获取信息,DOBOT MG400机械手实现动态实时抓取,并做了个GUI界面(python实现)

2023-10-27

GUI界面如下,丑是丑了点,但很好用,嘿嘿。 

GUI部分

 

1.GUI界面可以实现的功能

  • 暂停・继续相机画面
  • 显示彩色RGB图像・深度图像・开运算结果图・进行图像处理后的图片(右侧)
  • 调节opencv轮廓查找框选面积范围
  • 调节图像区域
  • 给dobot机械手使能
  • 机械手的移动,复位,夹爪开关,z轴上下移动,自动运行和停止

2.GUI部分代码

①布局

1.菜单栏f1

"""
菜单栏 f1
"""
f1 = Frame(root)
info_width = 1280
info_height = 30
canvas_menu = Canvas(f1, width=info_width, height=info_height)
canvas_menu.pack(side=LEFT, padx=1, pady=1)
f1.pack()

虽然目前菜单栏还没东西也没功能,但留了一条备用

2.功能区域f2

"""
功能区域 f2
"""
f2 = Frame(root)
# info_width = 1280
# info_height = 434
frame_fun = Frame(f2, width=880, height=324)
frame_screenshot = Frame(f2, width=400, height=324)
frame_fun.pack(side=LEFT, padx=1, pady=1)
frame_screenshot.pack(side=LEFT, padx=1, pady=1)
f2.pack()

按钮们

btn_pause = Button(frame_fun, text="CAMERA PAUSE", width=10, height=1, command=pause_camera)
btn_pause.place(x=10, y=10)
btn_dobot_pause = Button(frame_fun, text="ロボット起動", width=10, height=1, command=dobot_enable)
btn_dobot_pause.place(x=110, y=10)
btn_dobot_move = Button(frame_fun, text="目標位置へ移動", width=10, height=1, command=dobot_move)
btn_dobot_move.place(x=210, y=10)
btn_dobot_move_home = Button(frame_fun, text="原点", width=10, height=1, command=dobot_move_home)
btn_dobot_move_home.place(x=310, y=10)
btn_dobot_nail_on = Button(frame_fun, text="チャック開", width=10, height=1, command=dobot_nail_on)
btn_dobot_nail_on.place(x=410, y=10)
btn_dobot_nail_off = Button(frame_fun, text="チャック閉", width=10, height=1, command=dobot_nail_off)
btn_dobot_nail_off.place(x=510, y=10)
btn_dobot_move_down = Button(frame_fun, text="down", width=10, height=1, command=dobot_move_down)
btn_dobot_move_down.place(x=610, y=10)
btn_dobot_move_up = Button(frame_fun, text="up", width=10, height=1, command=dobot_move_up)
btn_dobot_move_up.place(x=710, y=10)
btn_dobot_automove = Button(frame_fun, text="自動運転", width=10, height=1, command=dobot_automove)
btn_dobot_automove.place(x=610, y=60)
btn_dobot_automove_stop = Button(frame_fun, text="自動運転停止", width=10, height=1, command=dobot_automove_stop)
btn_dobot_automove_stop.place(x=710, y=60)

检出面积滑块们

# 检出面积滑块们
var_min = IntVar()
scl_area_min = Scale(frame_fun, orient=HORIZONTAL, length=200, width=10, from_=1000, to=5000, label='最小検出サイズ (1500)', tickinterval=1, resolution=50, variable=var_min)
area_min = 1500
var_min.set(1500)
scl_area_min.bind('<ButtonRelease-1>', get_var_min)
scl_area_min.place(x=10, y=60)

var_max = IntVar()
scl_area_max = Scale(frame_fun, orient=HORIZONTAL, length=200, width=10, from_=1000, to=5000, label='最大検出サイズ (5000)', tickinterval=1, resolution=50, variable=var_max)
area_max = 5000
var_max.set(5000)
scl_area_max.bind('<ButtonRelease-1>', get_var_max)
scl_area_max.place(x=230, y=60)

裁剪面积滑块们

# 裁剪面积滑块们
var_sliced_left = IntVar()
scl_sliced_left = Scale(frame_fun, orient=HORIZONTAL, length=200, width=10, from_=0, to=640, label='sliced_left (500)', tickinterval=1, resolution=10, variable=var_sliced_left)
sliced_left = 540
var_sliced_left.set(540)
scl_sliced_left.bind('<ButtonRelease-1>', get_sliced_left)
scl_sliced_left.place(x=10, y=140)

var_sliced_right = IntVar()
scl_sliced_right = Scale(frame_fun, orient=HORIZONTAL, length=200, width=10, from_=640, to=1280, label='sliced_right (930)', tickinterval=1, resolution=10, variable=var_sliced_right)
sliced_right = 960
var_sliced_right.set(960)
scl_sliced_right.bind('<ButtonRelease-1>', get_sliced_right)
scl_sliced_right.place(x=230, y=140)

var_sliced_up = IntVar()
scl_sliced_up = Scale(frame_fun, orient=HORIZONTAL, length=200, width=10, from_=0, to=360, label='sliced_up (150)', tickinterval=1, resolution=10, variable=var_sliced_up)
sliced_up = 220
var_sliced_up.set(220)
scl_sliced_up.bind('<ButtonRelease-1>', get_sliced_up)
scl_sliced_up.place(x=450, y=140)

var_sliced_down = IntVar()
scl_sliced_down = Scale(frame_fun, orient=HORIZONTAL, length=200, width=10, from_=360, to=720, label='sliced_down (570)', tickinterval=1, resolution=10, variable=var_sliced_down)
sliced_down = 570
var_sliced_down.set(570)
scl_sliced_down.bind('<ButtonRelease-1>', get_sliced_down)
scl_sliced_down.place(x=670, y=140)

log日志部分

# log日志
message_dobot = Text(frame_fun, height=1, cursor='arrow', width=25)
message_dobot.insert("insert", "wait for dobot")
message_dobot.config(fg='red')
message_dobot.place(x=10, y=280)
message_log = Text(frame_fun, height=1, cursor='arrow', width=25)
message_log.place(x=10, y=300)

3.下方相机画面部分

"""
相机区域 f3
"""
f3 = Frame(root)
frame_width = 427
frame_height = 366
rgb_frame = Frame(f3, width=frame_width, height=frame_height)
depth_frame = Frame(f3, width=frame_width, height=frame_height)
opening_frame = Frame(f3, width=frame_width, height=frame_height)
rgb_frame.pack(side=LEFT, padx=1, pady=1)
depth_frame.pack(side=LEFT, padx=1, pady=1)
opening_frame.pack(side=LEFT, padx=1, pady=1)
f3.pack()

rgb_info = Label(rgb_frame, text="LIVE", font=("游明朝", 10))
rgb_info.place(x=5, y=0)
canvas_rgb = Canvas(rgb_frame)
canvas_rgb.place(x=25, y=50)
depth_info = Label(depth_frame, text="DEPTH", font=("游明朝", 10))
depth_info.place(x=5, y=0)
canvas_depth = Canvas(depth_frame)
canvas_depth.place(x=25, y=50)
opening_info = Label(opening_frame, text="OPENING", font=("游明朝", 10))
opening_info.place(x=5, y=0)
canvas_opening = Canvas(opening_frame)
canvas_opening.place(x=25, y=50)

②按钮绑定的函数们

  • 暂停・继续画面  def pause_camera():

 这部分比较简单,实现声明一个realsense相机的类,把类里的暂停状态改一下就可以

class State:
    def __init__(self, *args, **kwargs):
        self.WIN_NAME = 'RealSense'
        self.paused = False

state = State()
def pause_camera():
    state.paused ^= True
  • 获取滑块值 以获取左侧裁剪区域值为例 def get_sliced_left(event):
def get_sliced_left(event):
    global sliced_left
    sliced_left = int(var_sliced_left.get())
  •  机器人使能 def dobot_enable():

使用tcp-ip地址连接机器人,创建多线程对象,由于机械臂收到信息会立刻返回,在循环最后面需要向30003发送Sync()指令做一个阻塞,等待前面执行完成再反馈0{}Sync(),否则会出现程序停止机械臂还在运作这样的情况。 

def dobot_enable():
    global lj29999
    global lj30003
    lj29999 = LJ29999("192.168.1.6", 29999)  # 创建实例对象
    lj30003 = LJ30003("192.168.1.6", 30003)
    # # 根据自己处理器自行判断使用线程还是进程
    thread = Thread(target=FK,  # 新建一个线程做数据刷新
                    daemon=True  # 设置新线程为daemon线程
                    )
    thread.start()
    lj29999.send(" EnableRobot()")
    print("机器人使能中...")
    message_dobot.delete(1.0, END)
    message_dobot.insert("insert", "机器人使能中...")
    message_dobot.config(fg='black')
def FK():
    fk30005 = feedback("192.168.1.6", 30005)  # 处理器性能较弱可以使用30005反馈
    while True:
        time.sleep(0.021)  # 略大于反馈时间即可
        fk30005.read()
        # print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
        # print((fk30005.basics[1]))  # 打印轴实时位置

③下方视频区域

message_log.delete(1.0, END)
message_log.insert("insert", "live中...")
image_to_arm, arm_to_image = coordinate_transform()
img_color, img_depth, color_intrin, intr_matrix, color_intrin_coeffs, aligned_depth_frame, depth_mapped_image = get_aligned_images()
target_rgb, target_depth, target_opening = camera()
canvas_rgb.create_image(0, 0, anchor='nw', image=target_rgb)
canvas_depth.create_image(0, 0, anchor='nw', image=target_depth)
canvas_opening.create_image(0, 0, anchor='nw', image=target_opening)

root.update()
root.after(1)

视频实现时获取相机各个画面后,创建图片在画布上,实时刷新,已到达视频效果。

完整程序文件改日上传~!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

「完结撒花」使用intel realsense D435i深度相机获取信息,DOBOT MG400机械手实现动态实时抓取,并做了个GUI界面(python实现) 的相关文章

  • opencv 视频上的颜色阈值

    I am thresholding for a color range in an opencv video The goal is to seperate the B mode black and white information on
  • OpenCV findContours 破坏源图像

    我编写了一个在单通道空白图像中绘制圆形 直线和矩形的代码 之后 我只需找出图像中的轮廓 就可以正确获取所有轮廓 但找到轮廓后 我的源图像变得扭曲 为什么会出现这种情况 任何人都可以帮我解决这个问题 我的代码如下所示 using namesp
  • 如何使用 OpenCV 检测图像帧中的对象?

    我正在使用 Raspberry Pi 开发一个漫游器 它将清扫房间并捡起掉落在地上的物体 为了检测物体 我使用了在流动站操作开始时拍摄的参考图像 以及每 10 秒单击一次的图像 新图像 为了确定图像帧是否发生变化 我在参考图像和新图像之间进
  • 如何在Python中使用tcp套接字发送和接收网络摄像头流?

    我正在尝试重新创建这个项目 https github com hamuchiwa AutoRCCar 我拥有的是服务器 我的电脑 和客户端 我的树莓派 我所做的与原始项目不同的是我尝试使用一个简单的网络摄像头而不是树莓派摄像头将图像从我的
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • OpenCV:视频结束后如何重新启动?

    我正在播放视频文件 但播放完毕后如何再次播放 Javier 如果您想一遍又一遍地重新启动视频 也称为循环播放 可以通过在帧数达到时使用 if 语句来实现cap get cv2 cv CV CAP PROP FRAME COUNT 然后重置帧
  • 相机标定(OpenCV 2.3)-如何使用畸变参数?

    我有一组带有一些附加标记的刚体图像 我在这些标记之一中定义了一个原点坐标系 我想获得该坐标系与在相机原点定义的坐标系之间的旋转和平移 我尝试了一段时间 POSIT 以下this http goo gl cUYYt 但从未获得可接受的结果 直
  • Opencv未找到所有轮廓

    我试图找到该图像的轮廓 但是该方法查找轮廓只返回1轮廓 轮廓突出显示image 2 我正在努力寻找all外部轮廓就像这些圆圈 里面有数字 我究竟做错了什么 我可以做什么来实现它 image 1 image 2 以下是我的代码的相关部分 th
  • 在 RGB 图像上绘制多类语义分割透明叠加

    我有语义分割掩码的结果 值在 0 1 之间 需要大津阈值来确定什么是积极的 我想直接在 RGB 图像上绘制 在 RGB 图像上每个预测类具有不同的随机颜色 我使用以下内容绘制了具有单一颜色的单个蒙版 是否有一个包或简单的策略可以为多类别做到
  • Python:opencv warpPerspective 既不接受 2 个也不接受 3 个参数

    我发现单应矩阵如下特征匹配 单应性教程 https docs opencv org 3 4 1 d1 de0 tutorial py feature homography html using M mask cv2 findHomograp
  • 如何使用 Python 将我的 GoPro Hero 4 相机直播连接到 openCV?

    我在尝试从我的新 GoPro Hero 4 相机捕获实时流并使用 openCV 对其进行一些图像处理时遇到麻烦 这是我的试用 创建的窗口上没有显示任何内容 import cv2 import argparse import time imp
  • 在 QtCreator 中将 OpenCV 2.3 与 Qt 结合使用

    随着 OpenCV 2 3 版本终于发布 我想在我的系统上编译并安装这个最新版本 由于我经常使用 Qt 和 QtCreator 我当然希望能够在我的 Qt 项目中使用它 我已经尝试了几种方法几个小时 但总是出现错误 第一次尝试 使用WITH
  • OpenCV 仅围绕大轮廓绘制矩形?

    第一次发帖 希望我以正确的方式放置代码 我正在尝试检测和计算视频中的车辆 因此 如果您查看下面的代码 我会在阈值处理和膨胀后找到图像的轮廓 然后我使用 drawContours 和矩形在检测到的轮廓周围绘制一个框 我试图在 drawCont
  • opencv形态扩张滤波器作为最大滤波器

    就像中值滤波器的定义一样 我可以将 最大滤波器 定义为局部窗口 例如dst x y max 3x3 局部窗口像素 但我在opencv中找不到这样的过滤器 最接近的是 dilate 函数 然后我使用 dilate 函数的默认配置 但结果不正确
  • 创建 OpenCV 的 mouseCallback 函数的基于类的实现时遇到问题

    正如标题所示 我在基于类的 C 结构中实现 OpenCV 的 mouseCallback 函数时遇到了一些麻烦 请允许我解释一下 我定义了一个名为 BriskMatching 的类 在其中创建了一个名为 mouseCallback 的成员函
  • ffmpeg AVFrame 到 opencv Mat 转换

    我目前正在开发一个使用 ffmpeg 解码接收到的帧的项目 解码后 我想将 AVFrame 转换为 opencv Mat 帧 以便我可以在 imShow 函数上播放它 我拥有的是字节流 我将其读入缓冲区 解码为 AVFrame f fope
  • minAreaRect OpenCV 返回的裁剪矩形 [Python]

    minAreaRectOpenCV 中返回一个旋转的矩形 如何裁剪矩形内图像的这部分 boxPoints返回旋转矩形的角点的坐标 以便可以通过循环框内的点来访问像素 但是在 Python 中是否有更快的裁剪方法 EDIT See code在
  • opencv人脸检测示例

    当我在设备上运行应用程序时 应用程序崩溃并显示以下按摩 java lang UnsatisfiedLinkError 无法加载 detector based tracker findLibrary 返回 null 我正在使用 OpenCV
  • iOS 上的 OpenCV - VideoCapture 属性始终返回 1

    我一直在尝试构建一个简单的 OpenCV iOS 应用程序 该应用程序从捆绑包中加载视频并查询其帧数 持续时间等 然后它将尝试从中获取各个帧 不幸的是 当我使用VideoCapture类中 所有属性返回值 1 然后我尝试导航到frame 1
  • 在 Visual Studio 2012 中安装 OpenCV

    我正在尝试安装 OpenCV 来与 Visual Studio 一起使用 我使用的是2012Pro版本 但我认为它应该与vs10相同 我正在关注这个教程 http docs opencv org doc tutorials introduc

随机推荐

  • anaconda虚拟环境搭建(python+opencv)

    一般安装和使用流程 1 安装Anaconda 打开命令行输入conda V检验是否安装及当前conda的版本 以下操作均在Anaconda Prompt命令框下进行 2 conda常用的命令 1 查看安装了哪些包 conda list 2
  • 2019牛客多校训练赛第五场A题 (思维题)

    题目描述 看不清图片可以右击图片 gt 复制图片地址 gt 浏览器新开一个标签页 粘贴此地址就可看大图 也可以右击图片 gt 在新标签页打开图片 题解 题意 给你一个整型x x lt 100 让你输出一个整型y y要满足3个条件 y 能被
  • Ubuntu 20.04无法连接网络(网络图标丢失),重启网络出现Failed to restart network-manager.service

    问题 失去网络图标 这里已经解决 sudo service NetworkManager stop sudo rm var lib NetworkManager NetworkManager state sudo service Netwo
  • 如何按需下载和安装Win10补丁

    如何按需下载和安装Win10补丁 一般我们都是通过系统自带的Windows更新来直接安装补丁 这种方式虽然方便 但是耗时久 而且更新体量也大 会占用很多空间 其实我们完全可以按需下载和安装 下面就给大家介绍方法 工具 原料 Thinkpad
  • Harmony系统更改手机IP

    在当今的互联网环境中 我们经常需要更改手机的IP地址来绕过限制或保护我们的隐私 虽然在一些操作系统上更改IP地址相对较容易 但在Harmony系统上 这可能会有些困难 因此 本文将分享一种在Harmony系统上免费更改手机IP地址的方法 在
  • 【Java SE】继承和多态(保姆级教学)

    点进来你就是我的人了博主主页 戳一戳 欢迎大佬指点 欢迎志同道合的朋友一起加油喔 目录 前言 一 继承 1 什么是继承 2 继承的优缺点 3 对继承的理解 4 方法的重写 5 继承中的构造方法的调用 6 包的声明和使用 7 四种权限修饰符
  • SM3算法设计原理

    SM3密码杂凑算法的描述 SM3密码杂凑算法采用Merkle Damgard结构 消息分组长度为512b 摘要长度256b 压缩函数状态256b 共64步操作步骤 SM3密码杂凑算法的初始值 SM3密码杂凑算法的初始值共256b 由8个32
  • 5G LAN技术专题详解(1)-目录

    相关文章会在公众号同步更新 最近工作忙 更新完公众号后 经常容易忘记再CSDN上再发 公众号上的文章更新的能快一些 各位同学有兴趣可以关注一下 公众号 5G通信大家学 持续更新的相关5G内容都是直接根据3GPP整理 保证更新内容的准确性 避
  • VMware Fusion Pro 12 Mac介绍(支持11.0 Big Sur出来啦)

    VMware Fusion 12 出来啦 完美支持macOS Big Sur系统 Fusion 12 包含几项新的更新和改进 包括 eGPU 兼容性 对使用 Kubernetes 构建的基于容器的应用程序的支持 DirectX 11 和 O
  • 计算机软件毕业设计项目源码大全

    给计算机软件相关专业的同学准备了许多毕设项目源码 大家可以下载 找到跟自己类似的 学习下别人的软件是如何做出来的 gitee下载地址 https gitee com chenshuai777 soft 部分截图如下 太多了我就不一一截出来了
  • 数字化项目建设管理难点分析与对策

    企业数字化发展主要以项目建设为依托 通过分阶段 有计划地实施一系列数字化项目 来不断夯实基础设施建设 持续深化业务系统应用 大力推进研发资源服务 稳步提升安全保密防护措施 日益完善运维管理体系 随着企业改革的不断深入 在加快数字化建设进程过
  • 使用随机森林算法编写评分卡模型

    数据来源于信贷用户 数据量级为2W 首先读取数据 忽略警告 import warnings warnings filterwarnings ignore 导入常用库pandas Numpy matplotlib import pandas
  • Linux下如何操作寄存器(用户空间、内核空间方法讲解)

    本期主题 linux下操作寄存器 往期链接 linux设备驱动中的并发 linux设备驱动中的编译乱序和执行乱序 linux设备驱动之内核模块 linux字符驱动 linux字符驱动之ioctl部分 linux字符驱动之read write
  • 深度学习之强调一下数据的重要性

    在深度学习模型的测试过程中 数据集的选择很重要 在构造数据集的时候 要注意做好数据的清洗和标注 一个高质量的数据集往往能够提高模型训练的质量和预测的准确率 在缺乏数据的情况下 可以尝试寻找一些公开数据集 特别是得到公认的被普遍使用的数据集
  • HTML、CSS、JS简单介绍以及HTML的标签

    目录 一 HTML 结构 1 了解网页 2 了解HTML 二 CSS 样式 1 CSS 网页的美容师 2 CSS 的规则 3 CSS的格式 三 JavaScript 行为 1 JavaScript的历史 2 JavaScript的简介 3
  • 小白 / Java面试必知必会系列

    1 Java学习路线推荐 2 Java经典电子版书 3 Java面试必知必会 介绍 本仓库主要讲解Java在面试中的高频考点 分别包含Java基础 Java集合 Java多线程与并发编程 Java虚拟机 数据库 计算机基础 框架和中间件等
  • 在vue中 设置锚点 被固定顶部遮挡的问题

    1 如何设置锚点 点击左侧列表 跳转到页面指定的位置 将页面不同模块设置不同id属性 点击左侧菜单时 采用scrollIntoView 的方式实现 注 我用的是vue3 的 script setup语法糖 的写法 span 颜色 span
  • Diamond软件的使用--(1)软件安装及配置

    此处不推荐使用3 5版本的diamond 会出现RVL抓取数据失败的情况 我个人测试情况是使用3 11以上版本即可避免该情况 故演示采用目前最新的3 12版本 3 12版本 64位 官网链接 简单注册账户即可下载 https www lat
  • jdk8和jkd6去重

    jdk8和jkd6去重 jdk8去重 集合名称newList 去重字段getId 实体类PreFileMakeRangeOutEntity newList newList stream collect Collectors collecti
  • 「完结撒花」使用intel realsense D435i深度相机获取信息,DOBOT MG400机械手实现动态实时抓取,并做了个GUI界面(python实现)

    GUI界面如下 丑是丑了点 但很好用 嘿嘿 GUI部分 1 GUI界面可以实现的功能 暂停 继续相机画面 显示彩色RGB图像 深度图像 开运算结果图 进行图像处理后的图片 右侧 调节opencv轮廓查找框选面积范围 调节图像区域 给dobo