机器视觉企业级实战源码

hechunyan · · 59 次点击 · · 开始浏览    

机器视觉企业级实战源码

获课:keyouit.xyz/13882/
获取ZY↑↑方打开链接↑↑

以下为你提供一个简单的机器视觉企业级实战示例代码,使用 Python 和 OpenCV 库进行图像识别与处理,实现一个简单的物体检测功能。假设我们要在图像中检测特定颜色的物体(这里以红色物体为例)。

环境搭建
确保你已经安装了 Python 和 OpenCV 库。可以使用以下命令安装 OpenCV:

bash
复制代码
pip install opencv-python
示例代码
python
复制代码
import cv2
import numpy as np


def detect_red_objects(image_path):
    # 读取图像
    image = cv2.imread(image_path)

    # 将图像转换到 HSV 颜色空间
    hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

    # 定义红色在 HSV 颜色空间的范围
    lower_red = np.array([0, 100, 100])
    upper_red = np.array([10, 255, 255])
    mask1 = cv2.inRange(hsv_image, lower_red, upper_red)

    lower_red = np.array([160, 100, 100])
    upper_red = np.array([180, 255, 255])
    mask2 = cv2.inRange(hsv_image, lower_red, upper_red)

    # 合并两个掩码
    mask = mask1 + mask2

    # 进行形态学操作,去除噪声
    kernel = np.ones((5, 5), np.uint8)
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

    # 查找轮廓
    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 在原始图像上绘制检测到的轮廓
    for contour in contours:
        area = cv2.contourArea(contour)
        if area > 100:  # 过滤掉面积过小的轮廓
            x, y, w, h = cv2.boundingRect(contour)
            cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

    # 显示结果图像
    cv2.imshow('Red Objects Detection', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == "__main__":
    image_path = 'your_image.jpg'  # 替换为你的图像路径
    detect_red_objects(image_path)
代码说明
读取图像并转换颜色空间:使用 cv2.imread 读取图像,然后将 BGR 颜色空间转换为 HSV 颜色空间,因为在 HSV 颜色空间中更容易定义颜色范围。
定义颜色范围并创建掩码:红色在 HSV 颜色空间的范围分为两部分(因为红色跨越了 H 值的两端),使用 cv2.inRange 创建掩码,将图像中红色部分提取出来。
形态学操作:使用 cv2.morphologyEx 进行开运算和闭运算,去除掩码中的噪声和小空洞。
查找轮廓并绘制边界框:使用 cv2.findContours 查找掩码中的轮廓,然后过滤掉面积过小的轮廓,最后使用 cv2.rectangle 在原始图像上绘制检测到的物体的边界框。
实际企业应用中的扩展
实时视频流处理:在企业应用中,往往需要处理实时视频流,而不是单个图像。可以使用 cv2.VideoCapture 读取摄像头或视频文件的帧,然后对每一帧进行上述处理。
python
复制代码
cap = cv2.VideoCapture(0)  # 0 表示默认摄像头,也可以传入视频文件路径

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # 对帧进行物体检测处理
    # 这里省略与上面相同的处理代码

    cv2.imshow('Real-time Object Detection', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
深度学习集成:对于更复杂的物体检测任务,企业中常使用深度学习模型,如 YOLO(You Only Look Once)系列。可以使用 OpenCV 的 dnn 模块加载预训练的深度学习模型进行物体检测。
python
复制代码
import cv2
import numpy as np

# 加载 YOLO 模型
net = cv2.dnn.readNetFromDarknet('yolov3.cfg', 'yolov3.weights')
classes = []
with open('coco.names', 'r') as f:
    classes = f.read().splitlines()

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    height, width, _ = frame.shape
    blob = cv2.dnn.blobFromImage(frame, 1 / 255, (416, 416), (0, 0, 0), swapRB=True, crop=False)
    net.setInput(blob)
    output_layers_names = net.getUnconnectedOutLayersNames()
    layerOutputs = net.forward(output_layers_names)

    boxes = []
    confidences = []
    class_ids = []

    for output in layerOutputs:
        for detection in output:
            scores = detection[5:]
            class_id = np.argmax(scores)
            confidence = scores[class_id]
            if confidence > 0.5:
                center_x = int(detection[0] * width)
                center_y = int(detection[1] * height)
                w = int(detection[2] * width)
                h = int(detection[3] * height)

                x = int(center_x - w / 2)
                y = int(center_y - h / 2)

                boxes.append([x, y, w, h])
                confidences.append((float(confidence)))
                class_ids.append(class_id)

    indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)

    font = cv2.FONT_HERSHEY_PLAIN
    colors = np.random.uniform(0, 255, size=(len(classes), 3))

    if len(indexes) > 0:
        for i in indexes.flatten():
            x, y, w, h = boxes[i]
            label = str(classes[class_ids[i]])
            confidence = str(round(confidences[i], 2))
            color = colors[class_ids[i]]
            cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2)
            cv2.putText(frame, label + " " + confidence, (x, y + 20), font, 2, color, 2)

    cv2.imshow('Object Detection', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
以上代码只是简单的示例,在实际企业级机器视觉项目中,还需要考虑更多因素,如精度优化、性能提升、与其他系统的集成等。同时,不同的应用场景(如工业检测、医疗影像分析、安防监控等)会有不同的技术选型和实现细节。

重写
复制
 

59 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传