当前位置: 首页 > news >正文

Python开发系统

以下是一个基于Python和OpenCV的简单图像检测系统开发示例,包含目标检测、颜色检测和边缘检测功能:

 

一、环境搭建

 

1. 安装依赖

pip install opencv-python numpy matplotlib

 

2. 准备测试图片

下载示例图片或使用本地图片(如 test.jpg )。

 

二、基础功能实现

 

1. 目标检测(使用预训练模型)

 

import cv2

import numpy as np

 

def object_detection(image_path):

    # 加载COCO类别名称

    with open('coco.names', 'r') as f:

        classes = f.read().strip().split('\n')

    

    # 加载YOLOv3模型配置和权重

    net = cv2.dnn.readNetFromDarknet('yolov3.cfg', 'yolov3.weights')

    layer_names = net.getLayerNames()

    output_layers = [layer_names[i-1] for i in net.getUnconnectedOutLayers()]

    

    # 读取图像并预处理

    img = cv2.imread(image_path)

    height, width, channels = img.shape

    blob = cv2.dnn.blobFromImage(img, 0.00392, (416, 416), (0, 0, 0), True, crop=False)

    

    # 前向传播

    net.setInput(blob)

    outs = net.forward(output_layers)

    

    # 解析检测结果

    class_ids = []

    confidences = []

    boxes = []

    for out in outs:

        for detection in out:

            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

    for i in range(len(boxes)):

        if i in indexes:

            x, y, w, h = boxes[i]

            label = str(classes[class_ids[i]])

            confidence = confidences[i]

            cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

            cv2.putText(img, f"{label} {confidence:.2f}", (x, y+30), font, 2, (0, 255, 0), 2)

    

    return img

 

 

2. 颜色检测(以红色为例)

 

def color_detection(image_path, color='red'):

    img = cv2.imread(image_path)

    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    

    # 红色的HSV范围(分两个区间处理)

    if color == 'red':

        lower_red1 = np.array([0, 120, 70])

        upper_red1 = np.array([10, 255, 255])

        lower_red2 = np.array([170, 120, 70])

        upper_red2 = np.array([180, 255, 255])

        mask1 = cv2.inRange(hsv, lower_red1, upper_red1)

        mask2 = cv2.inRange(hsv, lower_red2, upper_red2)

        mask = mask1 + mask2

    else:

        # 其他颜色可自定义HSV范围(如绿色:lower=[35, 43, 46], upper=[77, 255, 255])

        mask = np.zeros_like(hsv[:, :, 0])

    

    # 轮廓检测

    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    for cnt in contours:

        area = cv2.contourArea(cnt)

        if area > 100: # 过滤小面积

            x, y, w, h = cv2.boundingRect(cnt)

            cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

    

    return img

 

 

3. 边缘检测(Canny算法)

 

def edge_detection(image_path):

    img = cv2.imread(image_path, 0) # 转为灰度图

    edges = cv2.Canny(img, 100, 200) # 调整阈值控制边缘灵敏度

    return edges

 

 

三、系统主界面

 

import matplotlib.pyplot as plt

 

def main():

    image_path = 'test.jpg' # 替换为你的图片路径

    

    while True:

        print("\n==== OpenCV图像检测系统 ====")

        print("1. 目标检测(YOLOv3)")

        print("2. 颜色检测(红色)")

        print("3. 边缘检测(Canny)")

        print("4. 退出系统")

        choice = input("请选择功能:")

        

        if choice == '1':

            result = object_detection(image_path)

        elif choice == '2':

            result = color_detection(image_path)

        elif choice == '3':

            result = edge_detection(image_path)

        elif choice == '4':

            print("系统退出!")

            break

        else:

            print("无效选择!")

            continue

        

        # 显示结果

        plt.figure(figsize=(10, 6))

        if choice == '3':

            plt.imshow(result, cmap='gray')

        else:

            plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))

        plt.axis('off')

        plt.title(f"检测结果 - 功能{choice}")

        plt.show()

 

if __name__ == "__main__":

    main()

 

 

四、运行说明

 

1. 下载模型文件

- 从YOLO官网下载 yolov3.cfg 和 yolov3.weights 

- 下载COCO类别名称文件,保存为 coco.names 

2. 运行代码

python image_detection_system.py

 

3. 功能扩展方向

- 更换模型(如YOLOv5、SSD)

- 支持视频流检测( cv2.VideoCapture() )

- 添加自定义颜色检测功能

- 集成图像预处理(降噪、缩放)

 

注意事项

 

- 目标检测模型较大,首次运行可能需要下载时间

- 颜色检测需根据实际场景调整HSV阈值

- 边缘检测阈值可通过滑动条动态调整(需添加GUI界面)

 

需要进一步优化某个功能或添加特定检测需求(如人脸检测、二维码识别),可以随时告诉我!

相关文章:

  • 比较Facebook与其他社交平台的隐私保护策略
  • http重新为https
  • 电梯称重控制仪功能与绳头板安装(客梯、货梯)关联性分析
  • springBoot2集成mybatis (手敲学习版)java入门友好
  • PostgreSQL 的 pg_start_backup 函数
  • 涨薪技术|0到1学会性能测试第53课-Tomcat配置
  • 【C语言干货】一维数组传参本质
  • 存储器:DDR和HBM的区别
  • AI视频生成的艺术:镜头语言
  • 【战略合作】开封大学_阀门产业学院+智橙PLM
  • 深入理解 Electron 的 IPC 通信机制:主渲染进程消息传递实战
  • 【论文+VLA】2505.GraspVLA——基于十亿级合成动作数据预训练的抓取基础模型(即将开源)
  • 【软件设计师:软件工程】9.软件开发模型与方法
  • python小记(十四):Python 中 **参数解包:深入理解与应用实践
  • WTK6900C-48L:离线语音芯片重构玩具DNA,从“按键操控”到“声控陪伴”的交互跃迁
  • WPF 子界面修改后通知到主页面
  • 一站式远程访问工具对比分析及选择建议
  • LeetCode:翻转二叉树
  • 使用OpenFOAM中的VOF模型仿真两相流
  • maven如何搭建自己的私服(windows版)?
  • 竞彩湃|英超欧冠悬念持续,纽卡斯尔诺丁汉能否拿分?
  • 魔都眼|邮轮港国际帆船赛启动,120名中外选手展开角逐
  • 河南一县政府党组成员签订抵制违规吃喝问题承诺书,现场交给县长
  • 纪念|脖子上挂着红领巾的陈逸飞
  • 美国务卿会见叙利亚外长,沙特等国表示将支持叙利亚重建
  • 悬疑剧背后的女编剧:创作的差异不在性别,而在经验