python获取鼠标位置,实时控制机械臂

实时获取鼠标位置

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')
    

python串口通信

首先安装串口类的包

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')
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值