赞
踩
import time import pyautogui as pag import os; try: while True: print("Press Ctrl-C to end") screenWidth, screenHeight = pag.size() # 获取屏幕的尺寸 x, y = pag.position() # 返回鼠标的坐标 print("Screen size: (%s %s), Position : (%s, %s)\n" % (screenWidth, screenHeight, x, y)) # 打印坐标 time.sleep(1) # 每个1s中打印一次 , 并执行清屏 os.system('cls') # 执行系统清屏指令 except KeyboardInterrupt: print('end')
首先安装串口类的包
pip install pyserial
import serial#导入模块 ser = serial.Serial(串口号,波特率) #打开第一个串口 print ser.portstr 能看到第一个串口的标识,windows下是COM1 ser.write(“hello") 就是往串口里面写数据 ser.close() 就是关闭ser表示的串口 ser.open() 会打开这个串口 ser = serial.Serial('COM1', 115200) 来设置波特率,当然还有专门的函数 data = ser.read()可以读一个字符 data = ser.read(20) 是读20个字符 data = ser.readline() 是读一行,以/n结束,要是没有/n就一直读,阻塞。 data = ser.readlines()和ser.xreadlines()都需要设置超时时间 ser.baudrate = 9600 设置波特率 ser 来查看当前串口的状态 ser.isOpen() 看看这个串口是否已经被打开
#!/usr/bin/python # coding=UTF-8 import serial ################################################### # # 功 能: 将接收到的数据已hex显示 # 参 数: 串口接受到的数据 # 返 回: 转换后的数据 # ################################################### def hexshow(data): hex_data = '' hLen = len(data) for i in xrange(hLen): hvol = ord(data[i]) hhex = '%02x' % hvol hex_data += hhex+' ' print 'hexshow:', hex_data ################################################### # # 功 能: 将需要发送的字符串以hex形式发送 # 参 数: 待发送的数据 # 返 回: 转换后的数据 # ################################################### def hexsend(string_data=''): hex_data = string_data.decode("hex") return hex_data if __name__ == '__main__': serial = serial.Serial('/dev/ttyS0', 115200) print serial if serial.isOpen(): print("open success") else: print("open failed") try: while True: count = serial.inWaiting() if count > 0: data = serial.read(count) if data != b'': print("receive:", data) serial.write(data) else: serial.write(hexsend(data)) except KeyboardInterrupt: if serial != None: serial.close()
整体逻辑:python开启串口,通过采集处理后的数据可以通过串口发送至arduino开发板上进行实时控制。
import cv2 import numpy as np import time import pyautogui as pag import os; import serial import math import re import numpy as np import cv2 cap = cv2.VideoCapture(0) cv2.namedWindow('camera', cv2.WINDOW_AUTOSIZE) def get_point(event, x, y, flags, param): # 鼠标单击事件 if event == cv2.EVENT_LBUTTONDOWN: # 输出坐标 print('坐标值: ', x, y) x = x y = y a1 = str(x)+","+str(y)+"," print(a1) serial.write(a1.encode('utf-8')) # 在传入参数图像上画出该点 # cv2.circle(param, (x, y), 1, (255, 255, 255), thickness=-1) img = param.copy() # 输出坐标点的像素值 print('像素值:', param[y][x]) # 注意此处反转,(纵,横,通道) # 显示坐标与像素 text = "(" + str(x) + ',' + str(y) + ')' + str(param[y][x]) cv2.putText(img, text, (0, param.shape[0]), cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 0, 255), 1) cv2.imshow('camera', frame) cv2.waitKey(0) serial = serial.Serial('COM10', 9600, timeout=0.5) if serial.isOpen() : print("open success") else : print("open failed") time.sleep(1) if __name__ == "__main__": while cap.isOpened(): ret, frame = cap.read() if ret: if frame is not None: gs_frame = cv2.GaussianBlur(frame, (5, 5), 0) hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV) # 转化成HSV图像 erode_hsv = cv2.erode(hsv, None, iterations=2) # 腐蚀 粗的变细 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) cv2.drawContours(frame, contours, -1, (0, 0, 255), 3) cv2.imshow('camera', frame) # image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) # 定义两个窗口 并绑定事件 传入各自对应的参数 cv2.namedWindow('frame') cv2.setMouseCallback('camera', get_point, frame)#鼠标点击中断回调函数->回调到get_point函数中 # 显示图像 while (True): cv2.imshow('camera', frame) if cv2.waitKey(20) & 0xFF == 27: break cap.release() cv2.waitKey(0) cv2.destroyAllWindows()
# -*- coding: utf-8 -*- """ Created on Fri Dec 17 11:25:18 2021 @author: sf """ # -*- encoding: utf-8 -*- import time import pyautogui as pag import os; import serial import math import re import numpy as np import cv2 def set_pen(x_1, y_1):#坐标反解函数 L1 = 7.5 L2 = 12.5#机械臂杆长 if int(x_1) ==0 & int(y_1) ==0: return m=math.sqrt(x_1*x_1+y_1*y_1) q = (L1*L1+L2*L2-m*m)/(2*L1*L2) if q<-1: q = -1 if q>1: q = 1 p = (L1*L1+m*m-L2*L2)/(2*L1*m) if p<-1: p = -1 if p>1: p = 1 format(q, '.4f') a1=math.acos(q) *180.0/3.14 a2=math.atan2(y_1,x_1)*180/3.14 a3=math.acos(p)*180/3.14 s_2=(a2-a3)*10+300 s_3=(180-a1)*1+200 # if s_2>800: # s_2 = 800 # if s_2<200: # s_2 = 200 # if s_3>600: # s_3 = 600 # if s_3<200: # s_3 = 200 #对于输出控制信号的限幅函数 return s_2+90 , s_3 serial = serial.Serial('COM10', 9600, timeout=0.5) if serial.isOpen() : print("open success") else : print("open failed") time.sleep(1) try: while True: print("Press Ctrl-C to end") screenWidth, screenHeight = pag.size() # 获取屏幕的尺寸 x, y = pag.position() # 返回鼠标的坐标 print("Screen size: (%s %s), Position : (%s, %s)\n" % (screenWidth, screenHeight, x, y)) # 打印坐标 x = x/100*5 y = y/100*5 thea1,thea2 = set_pen(x, y) thea1 = int(thea1) thea2 = int (thea2) thea1 = str(thea1)+"," thea2 = str(thea2)+"," print (thea1,thea2) if serial.inWaiting: # 读数据 msg = serial.readline() if msg: msg.decode('ascii', 'ignore') msg = str(msg, 'utf-8') print(msg) print(thea2) serial.write((thea1+thea2).encode('utf-8')) time.sleep(1) # 每个1s中打印一次 , 并执行清屏 os.system('cls') # 执行系统清屏指令 # serial.Serial.close(serial) except KeyboardInterrupt: print('end')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。