机器视觉企业级实战源码
获课: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()
以上代码只是简单的示例,在实际企业级机器视觉项目中,还需要考虑更多因素,如精度优化、性能提升、与其他系统的集成等。同时,不同的应用场景(如工业检测、医疗影像分析、安防监控等)会有不同的技术选型和实现细节。
重写
复制