智能机器人实验——机械臂画画
实验器材Dobot机械臂笔小型摄像头电脑软件白纸项目描述创意来源前段时间有个团队实现了通过手机拍照将照片传到机器中机器实现画图。于是想着通过Dobot机械臂实现同样甚至更好的功能。在实验指导书上看到Dobot机械臂能够简单的进行写字就联想到能够用它来画画由摄像头实时拍摄对象同时对显示的图像进行卡通化与素描化展示较好的效果最后输出图像到机械臂上让机械臂作图。实现功能1、通过python opencv包调用摄像头实现摄像头的图像实现2、对于每一帧的视频图像进行卡通化与素描化处理3、通过键盘控制摄像头进行拍照并将照片保存4、编写程序将图片从jpg格式转成svg矢量图格式将转化出的矢量图导入dobot模块控制机械臂绘图。算法实现1、图片卡通化算法def cartoon(image): gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) gray cv2.medianBlur(gray, 7) edges cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 10) color cv2.bilateralFilter(image, 12, 250, 250) cartoon cv2.bitwise_and(color, color, maskedges) return cartoon2、图片素描化算法def sumiao(image): cartoon_image1, cartoon_image2 cv2.pencilSketch(image, sigma_s60, sigma_r0.15, shade_factor0.05) return cartoon_image13、图片格式转化算法def bitmap_to_contour_svg(input_bitmap_path: str, output_svg_path: str): img cv2.imread(input_bitmap_path) dump_rings_from_image(img, output_pathoutput_svg_path) remove_matplotlib_background(output_svg_path)4、拍摄及主程序if cap.isOpened() is True: # 检查摄像头是否正常启动 while (True): # 获取摄像头拍摄到的画面 ret, frame cap.read() img frame cartoon1cartoon(img) sumiao1sumiao(img) stylish1stylish(img) # 实时展示效果画面 # cv2.imshow(frame1, frame) cv2.imshow(frame2,stylish1) cv2.imshow(frame, sumiao1) # 每5毫秒监听一次键盘动作 if cv2.waitKey(5) 0xFF ord(p): cv2.imwrite(pic_%d.jpg%i,stylish1) i 1 bmp_to_svg.bitmap_to_contour_svg(input_bitmap_pathpic_0.jpg, output_svg_pathpictuce_0.svg) if cv2.waitKey(5) 0xFF ord(q): break # 最后关闭所有窗口 cap.release() cv2.destroyAllWindows() else: print(cap is not opened!)呈现效果完整代码import cv2 import bmp_to_svg cap cv2.VideoCapture(0) i0 def cartoon(image): gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) gray cv2.medianBlur(gray, 7) edges cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 10) color cv2.bilateralFilter(image, 12, 250, 250) cartoon cv2.bitwise_and(color, color, maskedges) return cartoon def sumiao(image): cartoon_image1, cartoon_image2 cv2.pencilSketch(image, sigma_s60, sigma_r0.15, shade_factor0.05) return cartoon_image1 def stylish(image): # 风格化 cartoon_image cv2.stylization(image, sigma_s150, sigma_r0.45) return cartoon_image if cap.isOpened() is True: # 检查摄像头是否正常启动 while (True): # 获取摄像头拍摄到的画面 ret, frame cap.read() img frame cartoon1cartoon(img) sumiao1sumiao(img) stylish1stylish(img) # 实时展示效果画面 # cv2.imshow(frame1, frame) cv2.imshow(frame2,stylish1) cv2.imshow(frame, sumiao1) # 每5毫秒监听一次键盘动作 if cv2.waitKey(5) 0xFF ord(p): cv2.imwrite(pic_%d.jpg%i,stylish1) i 1 bmp_to_svg.bitmap_to_contour_svg(input_bitmap_pathpic_0.jpg, output_svg_pathpictuce_0.svg) if cv2.waitKey(5) 0xFF ord(q): break # 最后关闭所有窗口 cap.release() cv2.destroyAllWindows() else: print(cap is not opened!)bmp_to_svg.py文件from typing import Iterable, List, Tuple, Union import cv2 import matplotlib.pyplot as plt import numpy as np from xml.dom import minidom as md from queue import Queue import warnings def look_shape(a: Iterable) - Tuple: # for debug return np.array(a).shape def length_within_points(a: Iterable, empty_value: Union[int, float] 0) - int: a simple instance: array : [empty_value, empty_value, empty_value, 1, empty_value, 0, 1, 2, empty_value] Then length_within_points(array) will return index diff between 1 and 2, which is 5 a list(a) l_pivot, r_pivot -1, -2 for index, (l_val, r_val) in enumerate(zip(a[::1], a[::-1])): if l_val ! empty_value and l_pivot -1: l_pivot index if r_val ! empty_value and r_pivot -2: r_pivot len(a) - index return r_pivot - l_pivot 1 def dump_rings_from_image(image: np.ndarray, output_path: str, plot_dict: dict {color: k, linewidth: 2.0}, default_height: float 8) - List[np.ndarray]: # regular operation, no more explainations blur cv2.GaussianBlur(image, (3, 3), 0) gray cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY) edge cv2.Canny(gray, 50, 150) # get ratio between width and height to adjust the final output valid_width length_within_points(edge.sum(axis0)) valid_height length_within_points(edge.sum(axis1)) true_ratio valid_width / valid_height # get contour of the edge image contour_tuple cv2.findContours(edge, modecv2.RETR_TREE, methodcv2.CHAIN_APPROX_NONE) contours contour_tuple[0] rings [np.array(c).reshape([-1, 2]) for c in contours] # adjust coordinate system to the image coordinate system max_x, max_y, min_x, min_y 0, 0, 0, 0 for ring in rings: max_x max(max_x, ring.max(axis0)[0]) max_y max(max_y, ring.max(axis0)[1]) min_x max(min_x, ring.min(axis0)[0]) min_y max(min_y, ring.min(axis0)[1]) # adjust ratio plt.figure(figsize[default_height * true_ratio, default_height]) # plot to the matplotlib for _, ring in enumerate(rings): close_ring np.vstack((ring, ring[0])) xx close_ring[..., 0] yy max_y - close_ring[..., 1] plt.plot(xx, yy, **plot_dict) plt.axis(off) plt.savefig(output_path) def remove_matplotlib_background(svg_file: str, bg_node_name: str patch_1) - None: dom_tree: md.Document md.parse(svg_file) svg_node None # select the svg tag for node in dom_tree.childNodes: if node.nodeName svg: svg_node: md.Element node if svg_node is None: raise ValueError(not find a svg node in {}.format(svg_file)) # bfs svg node to find the background node q Queue() q.put(svg_node) target_node None # we will remove the target node while not q.empty(): cur: md.Node q.get() if cur.hasChildNodes(): for node in cur.childNodes: q.put(node) if hasattr(cur, getAttribute): # this is the id of the background node if cur.getAttribute(id) bg_node_name: target_node cur if target_node is None: warnings.warn(background node is not found, please ensure whether bg_node_name is correct) else: # remove and write target_node.parentNode.removeChild(target_node) with open(svg_file, w, encodingutf-8) as fp: dom_tree.writexml( writerfp, indent\t ) def bitmap_to_contour_svg(input_bitmap_path: str, output_svg_path: str): img cv2.imread(input_bitmap_path) dump_rings_from_image(img, output_pathoutput_svg_path) remove_matplotlib_background(output_svg_path) if __name__ __main__: bitmap_to_contour_svg( input_bitmap_pathpic_1_0.jpg, output_svg_path5.svg )

相关新闻

苏州简易注销失败,企业该如何走一般注销流程?

苏州简易注销失败,企业该如何走一般注销流程?

一条路走不通,换条路也得走完——注销这件事,拖越久代价越大 很多老板觉得简易注销被驳回了,干脆就不管了。但真相是:不注销的后果,比注销麻烦一百倍。法人被限制高消费、银行账户被冻结、甚至影响子女读书——这些都不…

2026/7/30 17:04:20 阅读更多 →
抖音批量下载神器Douzy:一键保存无水印视频的完整指南

抖音批量下载神器Douzy:一键保存无水印视频的完整指南

抖音批量下载神器Douzy:一键保存无水印视频的完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppo…

2026/7/30 17:04:20 阅读更多 →
Zigbee、STM32系列开发板-非定时器方式实现PWM呼吸灯-实时状态更改方法-呼吸灯简易实现方法

Zigbee、STM32系列开发板-非定时器方式实现PWM呼吸灯-实时状态更改方法-呼吸灯简易实现方法

一、概述 本文讲述关于PWM呼吸灯不使用定时器的呼吸方式,并且可以实现随时暂停至某一单个亮度的PWM调光程序,具有非常高的实时性,对外界改变操作实时做出反馈。 二、实现思路 本文的实现思路是以非定时器PWM实现的,需要先学习文章…

2026/7/30 17:03:20 阅读更多 →

最新新闻

CY5.5-RGD 多肽探针:菁染料 Cy5.5 标记近红外靶向探针性能特性研究

CY5.5-RGD 多肽探针:菁染料 Cy5.5 标记近红外靶向探针性能特性研究

拥有线性、环形两种结构 CY5.5-RGD 靶向荧光探针可供选择,产品仅限体外细胞、组织切片荧光示踪实验使用。依靠 RGD 短肽特异性识别高表达整合素受体的细胞,结合 Cy5.5 长波长荧光基团实现荧光信号有效区分,同时提供离体组织成像相关参数参考方…

2026/7/30 17:14:23 阅读更多 →
XM25QU512CXIQT08S-XMC(武汉新芯)1.8V NOR FLASH芯片

XM25QU512CXIQT08S-XMC(武汉新芯)1.8V NOR FLASH芯片

XM25QU512C 1.8V 512M-BIT SERIAL FLASH MEMORY WITH DUAL/QUAD SPI & QPIXMC(武汉新芯)XM25QU512CXIQT08S NOR FLASH芯片型号产品参数介绍:主要特性全新系列 SpiFlash 存储器– XM25QU512C:512M‑bit / 64M‑byte– 标准 SPI:CLK、/CS、…

2026/7/30 17:14:23 阅读更多 →
2026外贸AI询盘回复准确率实测:六大场景评测与选型推荐

2026外贸AI询盘回复准确率实测:六大场景评测与选型推荐

摘要:AI询盘回复系统的"准确率"不是单一数字能概括的——报价咨询、规格确认、交期物流、定制需求、多语言询盘、紧急高意向,六类场景对AI的理解深度和知识检索能力要求截然不同。本文基于公开可查数据和行业案例,对四家代表性平台…

2026/7/30 17:14:23 阅读更多 →
硬件测试内容之六:可靠性(医用)

硬件测试内容之六:可靠性(医用)

一、高温工作测试1. 测试目的验证医疗器械在高温工况下连续通电工作的稳定性,考核医用设备元器件、电路、屏幕、精密结构、输出精度在高温环境下的可靠性,排查高温漂移、性能失效、监护参数偏差、设备报错停机等风险,模拟医院常温偏高环境、设…

2026/7/30 17:14:23 阅读更多 →
HDMI之数据岛

HDMI之数据岛

概述 发送端在发送视频信号之前,将多媒体信息通过数据岛传输给接收端。接收端通过数据岛信息获取当前分辨率(VIC),编码信息(RGB/YCR等),色彩空间,位深等等。然后对应将视频信息解码。与此同时,多余的带宽用于传输音频信息等。本文通过具体的包信息(从实验室仪器拍照…

2026/7/30 17:14:23 阅读更多 →
AI营收分析避坑指南(附2023-2024财年TOP 50 SaaS公司失效模型清单)

AI营收分析避坑指南(附2023-2024财年TOP 50 SaaS公司失效模型清单)

更多请点击: https://kaifayun.com 第一章:AI营收分析避坑指南(附2023-2024财年TOP 50 SaaS公司失效模型清单) AI驱动的营收预测正被大量SaaS企业用于ARR拆解、LTV/CAC优化与销售资源调度,但2023–2024财年审计数据显…

2026/7/30 17:13:23 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻