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#串口进行通讯的一个案 ...
随机推荐
- Errors running builder 'JavaScript Validator' on
eclipse编译提示Errors running builder 'JavaScript Validator' on 解决方法见下图 去掉 'JavaScript Validator' 即可
- Symantec Backup Exec部署手册
转载 http://xiaxiaoguo.blog.51cto.com/858884/402810 Symantec Backup Exec部署手册 目录 1.Backup Exec 12.5安装. ...
- 怎样把引用的jar包和本项目一起导出成jar文件
之所以要导出Runnable JAR.是由于我们希望将引用到的Jar包与本项目一起进行导出,所以不要选Jar file 选File/Export...然后Java/Runnable JAR file, ...
- 自己定义ViewGroup控件(一)----->流式布局进阶(一)
main.xml <? xml version="1.0" encoding="utf-8"?> <com.example.SimpleLay ...
- canvas绘图数学知识总结
题外话: 最近看了一本书叫 <HTML5 Canvas核心技术 图形.动画与游戏开发>已经算是看了85%,基本接近尾声,所以近期会多总结一些关于canvas的东西, 这本书讲的还算可以,最 ...
- java多线程面试题(来自转载)
在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承thread类还是调用Runnable接口),然后逐渐问到并发问 ...
- 【BZOJ 5165】 树上倍增
[题目链接] 点击打开链接 [算法] 树上倍增,时间复杂度 : O(qklog(n)) [代码] #include<bits/stdc++.h> using namespace std; ...
- uva11542
https://vjudge.net/problem/UVA-11542 xor高斯消元... 答案为2^f-1 其实书上有一个问题 样例有3种情况,其中4,6,15是绑在一起的,也就是他们必须满足一 ...
- EasyUI Tree 树
转自:http://www.jeasyui.net/plugins/185.html 通过 $.fn.tree.defaults 重写默认的 defaults. 树(tree)在网页中以树形结构显示分 ...
- 词典(二) 哈希表(Hash table)
散列表(hashtable)是一种高效的词典结构,可以在期望的常数时间内实现对词典的所有接口的操作.散列完全摒弃了关键码有序的条件,所以可以突破CBA式算法的复杂度界限. 散列表 逻辑上,有一系列可以 ...