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)
View Code

  说明:有局限性,适合单一环境场景,环境复杂的场景,需要使用方法二

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))
View Code

               也可以在detect.py中添加参数来控制是设置宽高还是获取宽高

      5.2  在做上下电的实时黑屏检测过程中,第二次连接摄像头失败

            原因:视频流资源{cap = cv2.VideoCapture(s)}没有正确释放导致,添加参数is_release来通知停止取流,代码修改如下:

while cap.isOpened() and n < f:
            if self.is_release:
                cap.release()
                break
/utils/dataloaders.py

 

posted @ 2023-06-15 17:44  夜未央leo  阅读(39)  评论(0编辑  收藏  举报