python篇-工业相机学习
1,抠出屏的图
import cv2 from PIL import Image def getCoordinate(img): rectangle = [] gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图 ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # 二值化 element3 = cv2.getStructuringElement(cv2.MORPH_RECT, (8, 8)) # 设置膨胀和腐蚀操作 dilation = cv2.dilate(binary, element3, iterations=1) # 膨胀一次,让轮廓突出 contours, hierarchy = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_L1) # 检测轮廓 for contour in contours: x, y, w, h = cv2.boundingRect(contour) rectangle.append((x, y, x + w, y + h)) print(f'rectangle: {rectangle}') return rectangle def savePic(rectangle): for i in range(len(rectangle)-1): imgPath = rf"E:\Work\space\raspberry\test_{i}.jpg" # notes: 图片的扩展名要一致 im = Image.open(defaultImgPath) im = im.crop(rectangle[i]) # 对图片进行切割 im.crop(top_x, top_y, bottom_x, bottom_y) im.save(imgPath) if __name__ == '__main__': defaultImgPath = r"E:\Work\space\raspberry\test.jpg" img = cv2.imread(defaultImgPath) coordinateValue = getCoordinate(img) savePic(coordinateValue)
说明:有局限性,适合单一环境场景,环境复杂的场景,需要使用方法二
2,使用YOLOV5来做黑屏识别
1,配置LOYOV5环境
下载:git clone https://github.com/ultralytics/yolov5
yolov5s.pt另外下载
新建目录\yolov5-master\pic_a\images用来存放照片集,yolov5-master\pic_a\labels用在存放标注好的坐标文件
2,搜集好照片集使用Labelimg做目标标注,步骤如下
3,训练数据集
python train.py --batch 50 --epochs 100 --data pic_a/s.yaml --weights yolov5s.pt --nosave --cache
参数--batch :一轮训练照片张数
参数--epochs:训练轮数
这个过程很耗时,训练完成后,生成/runs/train/exp/weights/best.pt
4,测试训练的模型
python detect.py --weights yolov5-master/runs/train/exp3/weights/best.pt --img 640 --conf 0.9 --source pic_a/test1.jpg
参数--conf :置信度
参数--source:测试照片路径,如果使用摄像头实时监控,电脑本地摄像头使用--source 0,外接摄像头使用 --source 1
python detect.py --weights yolov5-master/runs/train/exp3/weights/best.pt --conf 0.9 --source 1
5,调试过程中遇到的问题
5.1 在使用海康摄像头调试的过程中,发现海康相机摄像头没有出图,需要修改视频帧的宽和高才能出图,代码修改如下:
cap = cv2.VideoCapture(s) assert cap.isOpened(), f'{st}Failed to open {s}' w = int(cap.set(cv2.CAP_PROP_FRAME_WIDTH, 2048)) h = int(cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1536))
也可以在detect.py中添加参数来控制是设置宽高还是获取宽高
5.2 在做上下电的实时黑屏检测过程中,第二次连接摄像头失败
原因:视频流资源{cap = cv2.VideoCapture(s)}没有正确释放导致,添加参数is_release来通知停止取流,代码修改如下:
while cap.isOpened() and n < f: if self.is_release: cap.release() break