基于opencv提取物体边框,用于机械臂抓取

将这张图读取边框

 读取图片

import cv2
import numpy as np

img_name = r"E:\new-learning\learn-porject\learn_opencv_tiqubiankuan_smarttrash\image\3.jpg"


img = cv2.imread(img_name)

new_size = (500, 600)
img = cv2.resize(img, new_size)

cv2.imshow('first', img)
# 等待用户按下任意键
cv2.waitKey(0)
# 关闭图像窗口
cv2.destroyAllWindows()

彩色图像灰度化

gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray', gray_img)
# 等待用户按下任意键
cv2.waitKey(0)
# 关闭图像窗口
cv2.destroyAllWindows()

二值化,均值滤波,OTSU分割法,之后画边框

# _, binary_image = cv2.threshold(gray_img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# threshold_value = img.mean()
# print(threshold_value)
cv2.imshow('gray', gray_img)

# 均值滤波
blurred_img = cv2.blur(gray_img, (5, 5))  # 可调整内核大小
cv2.imshow('blurred', blurred_img)

# threshold_value = 247

_, binary_image = cv2.threshold(blurred_img, threshold_value, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imshow('binary', binary_image)
contours, _ = cv2.findContours(binary_image, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

image_with_contours = img.copy()
cv2.drawContours(image_with_contours, contours, -1, (0, 255, 0), 2)

cv2.imshow('Image with Contours', image_with_contours)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

灰度:

均值滤波:

otsu分割法:

画边框:

缺点:物体白色的部分和背景相像,有什么好的办法能画边框不?

### 实现基于OpenCV的舵机控制机械视觉抓取 #### 一、硬件准备 为了完成这一项目,需要准备好以下设备: - 树莓派4B作为核心控制器[^2] - 舵机组件构成的机械 - USB摄像头用于图像采集 #### 二、软件环境搭建 安装必要的Python库来支持开发工作。通过pip命令可以轻松获取所需依赖项: ```bash pip install opencv-python numpy ``` 这将安装OpenCV和NumPy两个重要的第三方模块。 #### 三、物体检测与定位 利用颜色阈值法或其他特征匹配算法识别目标对象的位置信息。具体做法如下所示: 1. **读入视频流** 使用`cv.VideoCapture()`方法打开并捕捉来自USB摄像机的画面数据。 2. **预处理帧图片** 对每一帧执行色彩空间转换(如RGB转HSV),以便后续操作更加方便高效。 3. **设定感兴趣区域(ROI)** 定义一个矩形框限定搜索范围,减少计算量的同时提高准确性。 4. **应用形态学变换** 结合腐蚀膨胀等手段去除噪声干扰,突出显示待测物品轮廓。 5. **查找边界框中心点** 计算最小外接矩形或者质心坐标表示被抓物件的确切方位。 ```python import cv2 import numpy as np cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) lower_bound = np.array([170, 80, 80]) upper_bound = np.array([180, 255, 255]) mask = cv2.inRange(hsv_frame, lower_bound, upper_bound) kernel = np.ones((5, 5),np.uint8) morphed_mask = cv2.morphologyEx(mask,cv2.MORPH_OPEN,kernel) contours,hierarchy=cv2.findContours(morphed_mask.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2:] if len(contours)>0: c=max(contours,key=cv2.contourArea) ((x,y),radius)=cv2.minEnclosingCircle(c) center=(int(x), int(y)) # Draw the circle and centroid on the image cv2.circle(frame,center,int(radius),(0,255,0),2) cv2.circle(frame,center,5,(0,0,255),-1) print(f'Object Center Position:{center}') cv2.imshow('Frame',frame) key=cv2.waitKey(1)&0xFF if key==ord('q'): break cap.release() cv2.destroyAllWindows() ``` 上述代码片段展示了如何运用OpenCV库中的函数实现彩色物体跟踪,并输出其屏幕上的二维投影坐标。 #### 四、运动规划与路径生成 当获得物体的具体位置之后,则需考虑怎样指挥多自由度关节结构顺利抵达目的地而不发生碰撞事故。一般而言,此过程涉及以下几个方面的工作: - 正向/逆向运动学求解:确定末端效应器姿态对应的各轴角度参数;反之亦然。 - 避障策略制定:评估当前状态下是否存在潜在风险因素影响正常运作;若有则调整轨迹直至安全为止。 - 时间优化调度:合理安排动作序列顺序,在满足精度要求的前提下尽可能缩短周期时间。 对于简单的应用场景来说,可能仅需关注前两点即可达成预期效果。而针对复杂任务场景,则建议引入更高级别的决策机制辅助分析判断。 #### 五、伺服电机驱动接口编程 最后一步就是编写程序逻辑去操控实际物理装置按照预定计划行事了。通常情况下,可以通过PWM信号调节旋转速度大小进而改变伸缩长度远近关系从而带动整个机构灵活运转起来达到精准拾放的目的。 综上所述,借助于开源计算机视觉工具包——OpenCV的强大功能配合低成本嵌入式平台——Raspberry Pi完全可以构建一套简易却实用的小型自动化解决方案用来解决日常生活当中遇到的各种难题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值