20个OpenCV案例,让你了解计算机视觉的广泛应用!

您所在的位置:网站首页 机器视觉相关技术有哪些内容 20个OpenCV案例,让你了解计算机视觉的广泛应用!

20个OpenCV案例,让你了解计算机视觉的广泛应用!

2024-07-10 10:20| 来源: 网络整理| 查看: 265

本文介绍了20个关于OpenCV的案例,包括人脸识别、目标检测、图像分割、光流估计、特征提取、图像拼接、图像修复、图像变换、图像配准、视频分析、三维重建、图像处理、图像识别、文字识别、图像压缩、图像增强、图像分析、图像比对、图像转换和图像特效。这些案例展示了OpenCV在计算机视觉领域的广泛应用,可以帮助读者了解OpenCV的功能和应用场景,同时也为读者提供了一些灵感和启示,可以在自己的项目中应用OpenCV进行图像处理和分析。

1. 人脸识别:使用OpenCV的人脸识别算法,可以对图像或视频中的人脸进行识别和跟踪。

以下是使用OpenCV的人脸识别算法的示例代码:

import cv2 # 加载人脸识别分类器 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 加载图像或视频 img = cv2.imread('test.jpg') # 将图像转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 检测图像中的人脸 faces = face_cascade.detectMultiScale(gray, 1.3, 5) # 在图像中标记人脸 for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) # 显示标记后的图像 cv2.imshow('img', img) cv2.waitKey() 在此示例中,我们首先加载了OpenCV的人脸识别分类器(haarcascade_frontalface_default.xml),然后加载了一张测试图像(test.jpg)。我们将图像转换为灰度图像,并使用detectMultiScale函数检测图像中的人脸。最后,我们在图像中标记出检测到的人脸,并显示标记后的图像。 2. 目标检测:使用OpenCV的目标检测算法,可以对图像或视频中的目标进行检测和跟踪,例如车辆、行人等。

以下是使用OpenCV的目标检测算法的示例代码,可以对图像或视频中的车辆进行检测和跟踪:

import cv2 # 加载车辆检测分类器 car_cascade = cv2.CascadeClassifier('cars.xml') # 加载视频 cap = cv2.VideoCapture('cars.mp4') # 循环读取视频帧 while True: # 读取视频帧 ret, frame = cap.read() # 将视频帧转换为灰度图像 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 检测车辆 cars = car_cascade.detectMultiScale(gray, 1.1, 1) # 在视频帧中标记车辆 for (x, y, w, h) in cars: cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2) # 显示标记后的视频帧 cv2.imshow('video', frame) # 按下q键退出循环 if cv2.waitKey(25) & 0xFF == ord('q'): break # 释放视频 cap.release() # 关闭所有窗口 cv2.destroyAllWindows()

在此示例中,我们首先加载了OpenCV的车辆检测分类器(cars.xml),然后加载了一个测试视频(cars.mp4)。我们循环读取视频帧,将每个视频帧转换为灰度图像,并使用detectMultiScale函数检测车辆。最后,我们在视频帧中标记检测到的车辆,并显示标记后的视频帧。按下q键可以退出循环。

3. 图像分割:使用OpenCV的图像分割算法,可以将图像分割成多个区域,便于后续的处理和分析。

以下是使用OpenCV的图像分割算法的示例代码:

import cv2 import numpy as np # 读取图像 img = cv2.imread('image.jpg') # 转换为LAB颜色空间 lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB) # 提取颜色通道 l, a, b = cv2.split(lab) # 对L通道进行阈值分割 ret, thresh = cv2.threshold(l, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU) # 对二值化后的图像进行形态学操作,去除噪声 kernel = np.ones((3,3), np.uint8) opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2) # 执行距离变换,得到每个像素到最近背景像素的距离 dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5) # 对距离变换结果进行阈值分割,得到前景区域 ret, foreground = cv2.threshold(dist_transform, 0.7*dist_transform.max(), 255, 0) # 对前景区域进行形态学操作,得到更好的分割结果 kernel2 = np.ones((3,3), np.uint8) foreground = cv2.morphologyEx(foreground, cv2.MORPH_CLOSE, kernel2, iterations=2) # 显示结果 cv2.imshow('original', img) cv2.imshow('segmentation', foreground) cv2.waitKey(0) cv2.destroyAllWindows()

在此示例中,我们首先读取了一张图像(image.jpg),然后将其转换为LAB颜色空间,并提取了L通道。接下来,我们对L通道进行阈值分割,去除噪声,并执行距离变换,得到每个像素到最近背景像素的距离。然后,我们对距离变换结果进行阈值分割,得到前景区域,并对前景区域进行形态学操作,得到更好的分割结果。最后,我们显示原始图像和分割结果。

4. 光流估计:使用OpenCV的光流估计算法,可以对图像或视频中的运动进行估计,例如物体的速度、方向等。

以下是使用OpenCV的光流估计算法的示例代码:

import cv2 import numpy as np # 读取视频 cap = cv2.VideoCapture('video.mp4') # 读取第一帧 ret, prev_frame = cap.read() prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY) # 定义角点检测参数 feature_params = dict(maxCorners=100, qualityLevel=0.3, minDistance=7, blockSize=7) # 定义LK光流参数 lk_params = dict(winSize=(15, 15), maxLevel=2, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)) # 获取角点 prev_corners = cv2.goodFeaturesToTrack(prev_gray, mask=None, **feature_params) # 创建颜色 color = np.random.randint(0, 255, (100, 3)) # 循环处理每一帧 while True: # 读取当前帧 ret, curr_frame = cap.read() if not ret: break curr_gray = cv2.cvtColor(curr_frame, cv2.COLOR_BGR2GRAY) # 计算光流 curr_corners, status, err = cv2.calcOpticalFlowPyrLK(prev_gray, curr_gray, prev_corners, None, **lk_params) # 选择好的角点 good_new = curr_corners[status == 1] good_old = prev_corners[status == 1] # 绘制轨迹 for i, (new, old) in enumerate(zip(good_new, good_old)): a, b = new.ravel() c, d = old.ravel() mask = cv2.line(mask, (a, b), (c, d), color[i].tolist(), 2) frame = cv2.circle(curr_frame, (a, b), 5, color[i].tolist(), -1) img = cv2.add(frame, mask) # 显示结果 cv2.imshow('frame', img) k = cv2.waitKey(30) & 0xff if k == 27: break # 更新变量 prev_gray = curr_gray.copy() prev_corners = good_new.reshape(-1, 1, 2) cv2.destroyAllWindows() cap.release()

在此示例中,我们首先读取了一个视频(video.mp4),然后读取了第一帧,并将其转换为灰度图像。接下来,我们定义了角点检测参数和LK光流参数,并使用cv2.goodFeaturesToTrack()函数获取角点。然后,我们循环处理每一帧,计算光流,并选择好的角点。最后,我们绘制了运动轨迹,并显示了结果。

5. 特征提取:使用OpenCV的特征提取算法,可以从图像中提取出一些特征,例如边缘、角点等,便于后续的处理和分析。

以下是使用OpenCV的特征提取算法的示例代码,其中包括了边缘检测和角点检测两个示例: 边缘检测代码示例:

import cv2 import numpy as np # 读取图像 img = cv2.imread('image.jpg', 0) # Canny边缘检测 edges = cv2.Canny(img, 100, 200) # 显示结果 cv2.imshow('Edges', edges) cv2.waitKey(0) cv2.destroyAllWindows()

角点检测代码示例:

import cv2 import numpy as np # 读取图像 img = cv2.imread('image.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Shi-Tomasi角点检测 corners = cv2.goodFeaturesToTrack(gray, 25, 0.01, 10) corners = np.int0(corners) # 绘制角点 for i in corners: x, y = i.ravel() cv2.circle(img, (x, y), 3, (0, 0, 255), -1) # 显示结果 cv2.imshow('Corners', img) cv2.waitKey(0) cv2.destroyAllWindows()

以上是两个基本的特征提取算法的示例代码,可以根据实际需求进行修改和优化。

6. 图像拼接:使用OpenCV的图像拼接算法,可以将多张图像拼接成一张大图,例如全景图。

以下是使用OpenCV的图像拼接算法的示例代码,其中包括了将两张图像拼接成一张全景图的示例:

import cv2 import numpy as np # 读取两张图像 img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') # 将两张图像转为灰度图像 gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) # 使用SIFT算法提取特征点和特征描述符 sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(gray1, None) kp2, des2 = sift.detectAndCompute(gray2, None) # 使用FLANN算法进行特征点匹配 FLANN_INDEX_KDTREE = 0 index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) search_params = dict(checks=50) flann = cv2.FlannBasedMatcher(index_params, search_params) matches = flann.knnMatch(des1, des2, k=2) # 选出最佳匹配的特征点 good = [] for m, n in matches: if m.distance 100 and h > 20 and w


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3