智能机器人实验——机械臂画画
实验器材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 )

相关新闻

三色标记算法详解(面试题)

三色标记算法详解(面试题)

三色标记算法详解(面试题) 本文档涵盖以下面试题,逐题给出详细答案: 三色标记算法了解吗? 三色标记优点? 标记过程? 产生的问题? 一、三色标记算法了解吗? 1.1 什么是三色标记算法 三色标记算法(Tri-color Marking)是一种并发垃圾标记算法,最早由 Dijkstra 等人提…

2026/7/30 17:05:39阅读更多 →
LLM集成与AI智能体开发实战:从原理到企业级应用

LLM集成与AI智能体开发实战:从原理到企业级应用

2026年伦敦DConf大会:LLM集成与AI智能体开发实战指南最近在准备参加2026年伦敦DConf大会的技术分享时,发现LLM集成与AI智能体开发已经成为开发者社区的热门话题。无论是企业级应用还是个人项目,如何高效地将大语言模型集成到现有系统中&#…

2026/7/30 17:03:39阅读更多 →
BES(恒玄) 2600X 蓝牙A2DP低延时解析

BES(恒玄) 2600X 蓝牙A2DP低延时解析

对于延时来说,一般蓝牙耳机整体延时主要分为手机端和耳机端,整个链路上延时主要集中在数据buffer区域 做低延时的方案有以下两个方向 1、一般的编解码方式,AAC跟SBC,用SBC来做低延时比较好,为什么呢?因为它需要解码的数据更少, 1 frame = 128 sample,而AAC的话,1 fr…

2026/7/30 17:03:39阅读更多 →
Excel批量搜索神器:3步搞定海量Excel文件内容检索的终极解决方案

Excel批量搜索神器:3步搞定海量Excel文件内容检索的终极解决方案

Excel批量搜索神器:3步搞定海量Excel文件内容检索的终极解决方案 【免费下载链接】QueryExcel 多Excel文件内容查询工具。 项目地址: https://gitcode.com/gh_mirrors/qu/QueryExcel 还在为在成百上千个Excel文件中查找特定信息而烦恼吗?QueryExc…

2026/7/30 18:18:15阅读更多 →
域名服务器(DNS)解析实验

域名服务器(DNS)解析实验

0.实验准备 服务端IP 客户端IP 网址 域名 192.168.83.130 192.168.83.129 www.openlab.com …

2026/7/30 18:18:15阅读更多 →
如何用开源神器全面掌握电脑健康状况:LibreHardwareMonitor终极指南

如何用开源神器全面掌握电脑健康状况:LibreHardwareMonitor终极指南

如何用开源神器全面掌握电脑健康状况:LibreHardwareMonitor终极指南 【免费下载链接】LibreHardwareMonitor Libre Hardware Monitor is free software that can monitor the temperature sensors, fan speeds, voltages, load and clock speeds of your computer. …

2026/7/30 18:18:15阅读更多 →
一个提示词,一个完整工作流:Elastic 的 AI agent 为你编写自动化流程

一个提示词,一个完整工作流:Elastic 的 AI agent 为你编写自动化流程

作者:来自 Elastic Tinsae Erkailo 及 Shahar Glazner Elastic Workflows 接受纯文本提示词,并生成你可以检查、版本控制和针对 Elasticsearch 数据运行的 YAML。现在已正式发布,支持 Slack 中的人机协同工作流、并行执行以及 10 个新的连接器…

2026/7/30 18:18:15阅读更多 →
【单片机毕业设计推荐】基于 STM32/51 单片机的 12864 称重计价装置设计与实现 基于单片机的 HX711 称重计价终端系统设计(021104)

【单片机毕业设计推荐】基于 STM32/51 单片机的 12864 称重计价装置设计与实现 基于单片机的 HX711 称重计价终端系统设计(021104)

文章目录20 个相关毕业设计备选题目项目研究背景摘要总体方案核心功能基础功能核心功能辅助功能技术路线项目演示关于我们项目案例源码获取温馨提示:本人主页置顶文章(点我)有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶…

2026/7/30 18:18:15阅读更多 →
ChIP/ATAC/CUT/DAP必看——*Peak到底怎么来的

ChIP/ATAC/CUT/DAP必看——*Peak到底怎么来的

在分子生物学研究中,识别和分析基因组范围内的调控元素是理解基因表达调控机制的关键。随着高通量测序技术的不断进步,诸如ChIP-seq、ATAC-seq、CUT&Tag和DAP-seq等技术为我们提供了强大的工具,以揭示转录因子结合位点、开放染色质区域和…

2026/7/30 18:16:15阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/30 15:03:16阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/30 15:13:02阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 🚀 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

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

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

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/30 15:43:46阅读更多 →