python与arduino串口通讯对接opencv实现智能物品分拣
2018-05-0118:53:50
先上图:

再来视频:
http://v.youku.com/v_show/id_XMzU3NzAwNzMyNA==.html?spm=a2hzp.8244740.0.0
#coding=utf-8
from pyfirmata import Arduino, util
import time
import cv2
import numpy as np
import serial
ser = serial.Serial()
ser.baudrate = 9600 # 设置波特率
ser.port = 'COM6' # 端口是COM3
print(ser)
ser.open() # 打开串口
print(ser.is_open) # 检验串口是否打开
# board = Arduino('COM3')
"""
def duoji ():
board.servo_config(13, 0, 255, 20)
print("ceshi")
time.sleep(0.2)
board.servo_config(13, 0, 255, 255)
time.sleep(0.2)
def arduino ():
board.digital[13].write(0) # 向io口13写入0
time.sleep(0.1)
board.digital[13].write(1) # 向io口13写入1
time.sleep(0.1)
board.analog [13].write(100)
"""
def detect_circle_demo ():
video_capture = cv2.VideoCapture(0)
while True:
if not video_capture.isOpened():
print('Unable to load camera.')
break
ret, img = video_capture.read()
#img = cv2.pyrMeanShiftFiltering(img, 10, 25)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图像
circles1 = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT , 1, 100, param1=100, param2=100, minRadius=50,maxRadius=200)
# cv.HoughCircles(cimage, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)
try: # 如果上一步没有检测到。执行try内容,就会报错。可以修改尝试看下。
circles = circles1[0, :, :] # 提取为二维
except TypeError:
print('未发现圆形物体!!')
else:
circles = np.uint16(np.around(circles)) # 四舍五入
for i in circles[:]:
cv2.circle(img, (i[0], i[1]), i[2], color=[0, 0, 0], thickness=2) # 画圆
cv2.circle(img, (i[0], i[1]), 2, color=[0, 255, 0], thickness=2) # 画圆心
cv2.putText(img, "center", (i[0] - 20, i[1] - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
print(i[0],i[1])
print("检测到圆形物体,开始分离!")
ser.write(b"a")
#print(ser.read(1))
# 输出坐标
# 显示视频
cv2.imshow('Video', img)
cv2.waitKey(10)
detect_circle_demo() """
dp,用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,且此参数允许创建一个比输入图像分辨率低的累加器。上述文字不好理解的话,来看例子吧。例如,如果dp= 1时,累加器和输入图像具有相同的分辨率。如果dp=2,累加器便有输入图像一半那么大的宽度和高度。
minDist,为霍夫变换检测到的圆的圆心之间的最小距离,即让我们的算法能明显区分的两个不同圆之间的最小距离。这个参数如果太小的话,多个相邻的圆可能被错误地检测成了一个重合的圆。反之,这个参数设置太大的话,某些圆就不能被检测出来了。
param1,有默认值100。它是method设置的检测方法的对应的参数。对当前唯一的方法霍夫梯度法,它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半。
param2,也有默认值100。它是method设置的检测方法的对应的参数。对当前唯一的方法霍夫梯度法,它表示在检测阶段圆心的累加器阈值。它越小的话,就可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了。
minRadius,默认值0,表示圆半径的最小值。
maxRadius,也有默认值0,表示圆半径的最大值
"""
程序的原理是图像识别,并将圆形物体取出来。python发送数据给单片机,舵机执行相关动作。
#include<Stepper.h>
#include <Servo.h>
Servo myservo;
Servo myservo1;
char serial_line[] ="";
int serial_line_length=;
char val='/';
#define STEPS 100
Stepper stepper(STEPS, , , , );
int pos;
int pos1;
int i ;
void setup()
{
Serial.begin();
pinMode(,OUTPUT);
digitalWrite(,HIGH);
myservo.attach();
myservo1.attach();
myservo.write();
myservo1.write();
stepper.setSpeed(); }
void zhixing()
{
myservo.write();//右
delay();
digitalWrite(,LOW);//吸
for (pos = ;pos>=;pos-=)
{
myservo1.write(pos);
delay();
}
myservo1.write();
delay();
myservo.write(); /////归位
delay();
digitalWrite(,HIGH); }
void loop()
{
stepper.step(-);
Serial.println("go");
val=Serial.read();
if (val == 'a')//检测到圆形物体
{ if (i == )
{
Serial.println('');
zhixing();
i = ;
}
else i++ ; //Serial.println(i); } }
两者相互配合,实现物体分拣。
python与arduino串口通讯对接opencv实现智能物品分拣的更多相关文章
- Arduino 串口通讯参考笔记 - Serial 类库及相关函数介绍
声明: 本ID发布的所有文章及随笔均为原创,可随意转载,单转载文章必须注明作者 aiyauto 及包含原文出处地址 http://www.cnblogs.com/aiyauto/p/7071712.h ...
- win10上使用php与python实现与arduino串口通信
注意: php 需要php7,安装及开启php_dio.dll com口按照实际的进行设置,如果不知道可以打开arduino编辑器进行查看 可以与用户实现命令行交互,但是效率过慢,不清楚如何优化,使用 ...
- 手机与Arduino蓝牙串口通讯实验及完整例程
安卓手机与Arduino之间采用蓝牙串口通讯,是很多智能装置和互动装置常用的控制方法,简单而有效,无需网络环境,很实用的技术. 实验采用Arduino UNO板,加了一块1602LCD屏做显示(因为只 ...
- Python 串口通讯
摘要: pyserial module: https://github.com/tbusf/pyserial Python使用pyserial进行串口通信:http://blog.csdn.net/l ...
- python实现串口通讯小程序(GUI界面)
python实现串口通讯小程序(GUI界面) 使用python实现串口通讯需要使用python的pyserial库来实现,这个库在安装python的时候没有自动进行安装,需要自己进行安装. 1.安装p ...
- 用电脑Python控制Arduino
python指令: import serial #导入串口通讯库 import time ser=serial.Serial("com4",9600,timeout=1) demo ...
- modbus串口通讯C#
简介 公司给的一个小任务,这篇文章进行详细讲解 题目: modbus串口通讯 主要内容如下: 1.实现使用modbus通讯规约的测试软件: 2.具有通信超时功能: 3.分主站从站,并能编辑报文.生成报 ...
- Winform 串口通讯之读卡器
老板给我的第一个硬件就是一个读卡器, 说让我做一下试试,于是从网上查了查就写了出来,相当的简单. 但是后来还有一个地磅的串口通讯,我整整搞了一天. 在窗体类的构造函数中写入 Form.CheckFor ...
- 【单片机入门】(三)应用层软件开发的单片机学习之路-----UART串口通讯和c#交互
引言 在第一章博客中,我们讲了Arduino对Esp32的一个环境配置,以及了解到了常用的一个总线通讯协议,其中有SPI,IIC,UART等,今天我为大家带来UART串口通讯和c#串口进行通讯的一个案 ...
随机推荐
- python: filter, map, reduce, lambda
filter built-in function filter(f,sequence) filter can apply the function f to each element of seque ...
- Android Wear - App Structure for Android Wear(应用结构)
---------------------------------------------------------------------------------------------------- ...
- STM8S---外部中断应用之长按键识别
STM8经常使用中断指令 开总中断 _asm("rim"); 禁止中断 _asm("sim"); 进入停机模式 _asm("halt"); ...
- poj 3233(矩阵高速幂)
题目链接:http://poj.org/problem?id=3233. 题意:给出一个公式求这个式子模m的解: 分析:本题就是给的矩阵,所以非常显然是矩阵高速幂,但有一点.本题k的值非常大.所以要用 ...
- python 简单连接mysql数据库
1. 安装pymysql 库 pip install pymysql 2.实例本地连接mysql库 #!/usr/bin/python # encoding: utf-8 ""&q ...
- MySQL中文參考手冊
非常好的中文手冊: 链接:http://www.sdau.edu.cn/support/mysq_doc/manual_toc.html
- Cannot change version of project facet Dynamic Web Module to 3.1 (Eclipse Maven唯一解决方式)
If you want to use version 3.1 you need to use the following schema: http://xmlns.jcp.org/xml/ns/jav ...
- 怎样将DrawerLayout显示在ActionBar/Toolbar和status bar之间
控制status bar utm_source=tuicool#toc_1" style="color:rgb(0,0,0); text-decoration:none; line ...
- Spring 之AOP 面向切面编程
AOP相关术语: Joinpoint (连接点):所谓连接点是指那些被拦截到的点,在spring中,这些点指的是方法,因为spring 只支持方法类型的连接点. Pointcut(切入点):所谓切入点 ...
- ngnix 详解
4 Nginx的rpm软件包安装 4.1 安装包在位置 D:\讲课内容--\新巴巴运动网\nginx高并发解决\nginx安装包 4.2 此种安装方式不用安装gcc等编译工具 4.3 安装命令如下 r ...