硬件架构
pc camera
pc 通过usb串口与arduino通信 控制继电器 实现开关机
pc串口控制arduino 屏幕和电源
pc通过camera获取屏幕图像ocr判断结果
https://blog.csdn.net/kamille1024/article/details/119951948
https://blog.csdn.net/qq_38017966/article/details/118724459
上位机 Pyhon 配置环境
1. 串口:
安装
解决办法 使用ptcharm terminal 安装 pyserial
2. 问题 import cv2
ptcharm terminal 安装 opencv-python
pip3 install opencv-python
from PIL import Image安装PIL: pip install pillow
3. OCR 配置
ubuntu 参考:ubuntu中pytesseract 安装和使用示例
- 安装OCR
pip install pytesseract -i https://pypi.douban.com/simple
安装Index of /tesseract到windows系统,写下安装路径
可以打开pycharm 输入代码import pytesseract.pytesseract 然后按住ctrl键鼠标对着pytesseract点击右键
将tesseract_cmd = 'tesseract’修改为:
tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
增加两个环境变量
识别中文,单独安装识别引擎不能识别中文,需要下载其他东西
https://github.com/tesseract-ocr/tessdata
将里面的 chi_sim.traineddata、chi_sim_vert.traineddata、chi_tra.traineddata和chi_tra_vert.traineddata文件放入tesseract-ocr的tessdata目录下(C:\Program Files\Tesseract-OCR\tessdata)
可以使用windows命令直接检查环境是否成功,empty page说明未识别,识别结果将存储在同一目录中result.txt
Ubuntu environment setup
check serial port
iffy@iffy-EP43-DS3L:~$ [ 0.143425] printk: console [tty0] enabled [ 0.412498] 00:02: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A [ 1444.721675] cdc_acm 4-1:1.0: ttyACM0: USB ACM device
Com port is ACM0
Serial port tool
-
# 安装
-
sudo apt install cutecom
-
# 启动
-
sudo cutecom
Permission issue
Traceback (most recent call last): File "/home/iffy/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/serial/serialposix.py", line 322, in open self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK) PermissionError: [Errno 13] Permission denied: '/dev/ttyACM0'
temp solution: sudo chmod 666 /dev/ttyACM0
Formal solution
Permission denied on /dev/ttyACM0 - #27 by system - Installation & Troubleshooting - Arduino Forum
You can solve it by adding yourself to the group in Debian-based Linux, or group in Arch Linux.
sudo usermod -a -G dialout $USER
OR
sudo usermod -a -G uucp $USER
open CV can't open camera
cv2.imwrite((outputPath currenttime test_name '_aoriginal.jpg'), gray) cv2.error: OpenCV(4.5.5) /io/opencv/modules/imgcodecs/src/loadsave.cpp:801: error: (-215:Assertion failed) !_img.empty() in function 'imwrite'
check camera work or not
sudo apt-get install cheese cheese
check camera id
sudo apt install v4l-utils v4l2-ctl -d /dev/video0 --all Driver Info: Driver name : uvcvideo Card type : UVC Camera (046d:0918): Logitec Bus info : usb-0000:00:1a.7-5 Driver version : 5.13.19 Capabilities : 0x84a00001 Video Capture Metadata Capture Streaming Extended Pix Format Device Capabilities Device Caps : 0x04200001 Video Capture Streaming Extended Pix Format Priority: 2 Video input : 0 (Camera 1: ok) Format Video Capture: Width/Height : 640/480 Pixel Format : 'YUYV' (YUYV 4:2:2) Field : None Bytes per Line : 1280 Size Image : 614400 Colorspace : Default Transfer Function : Default (maps to Rec. 709) YCbCr/HSV Encoding: Default (maps to ITU-R 601) Quantization : Default (maps to Limited Range)
solution:
self.cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
改为:
self.cap = cv2.VideoCapture(0)
Install tesserct on ubuntu
sudo apt-get install tesseract-ocr
Python 代码逻辑
- 连接并打开串口
- 接通继电器
Loop
1.创建目录
2. 判断是否黑色
3. OCR 后图片放入目录,输出测试结果
4. 点击Home
5. 判断是否黑色
6. OCR 后图片放入目录,输出测试结果
7. 点击最后一个按钮
8. OCR 后图片放入目录, 输出测试结果
9. 重命名目录结果
Pytest 配置:
pip install -U pytest
Allure 生成测试报告:
pip install allure-pytest
Release 2.17.3 · allure-framework/allure2 · GitHub
修改Log allure修改默认logo方法 - 知乎
C:\allure2.17.3\plugins\custom-logo-plugin\static\styles.css
.side-nav__brand {
background: url('ic_launcher.png') no-repeat left center !important;
margin-left: 10px;
height: 200px;
width: 200px;
}
.side-nav__brand-text{
/* 去掉图片后边 allure 文本 */
display: none;
}
.side-nav__brand:after{
content: "myTitle";
margin-left: 18px;
height: 20px;
font-family: kai;
font-size: 13px;
}
pycharm中pytest如何将⼀条⽤例执⾏多次
pytest.main(['-s', '-vv', '--alluredir', 'temp','--count=10'])
下位机 Arduino 部分
开关机代码
int pinRelay = 11; //管脚D3连接到继电器模块的信号脚
int pinJidianqi = 7; //管脚D3连接到继电器模块的信号脚
void setup() {
pinMode(pinRelay, OUTPUT); //设置pinRelay脚为输出状态
pinMode(pinJidianqi, OUTPUT); //设置pinRelay脚为输出状态
}
void loop() {
digitalWrite(pinRelay, HIGH);//输出HIGH电平,继电器模块闭合
digitalWrite(pinJidianqi, HIGH);//输出HIGH电平,继电器模块闭合
delay(300000); //等待300000毫秒 5分钟
digitalWrite(pinRelay, LOW);//输出LOW电平,继电器模块断开
digitalWrite(pinJidianqi, LOW);//输出LOW电平,继电器模块断开
delay(600000); //等待300000毫秒 6分钟
}