C++图像处理:cv_findcontours_sample案例分析

需积分: 10 0 下载量 194 浏览量 更新于2024-11-14 收藏 18.15MB ZIP 举报
资源摘要信息:"cv_findcontours_sample:简历" 标题:“cv_findcontours_sample:简历”表明此资源与简历相关,同时也与C++编程语言中的图像处理技术有关。资源名称暗示了示例的性质,尤其是使用了OpenCV库中的cv::findContours()函数。 描述:“cv_findcontours_sample 使用cv :: findContours()的示例”说明了该资源是一个使用OpenCV库中cv::findContours()函数的具体示例。cv::findContours()是一个用于提取图像中物体轮廓的函数,常用于图像分割、特征提取等图像处理领域。 标签:“C++”指明了编程语言,说明这个资源是使用C++语言编写的。OpenCV库在C++中广泛应用于计算机视觉和机器学习项目。 文件名称列表:“cv_findcontours_sample-master”暗示了该资源可能是一个版本控制系统(如Git)中的一个项目,具备代码的版本管理功能,便于代码的更新和维护。文件名中的“-master”表明这是项目的主分支或者主版本。 知识点: 1. OpenCV库 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它由一系列的C/C++函数和少量C++类组成,实现了图像处理、视频分析、特征检测、机器学习等多个功能。OpenCV支持多种编程语言,包括C++、Python、Java等。 2. cv::findContours() cv::findContours()函数是OpenCV库中用于检测和提取图像中物体轮廓的函数。轮廓是指具有相同颜色或强度的连续点的曲线集合。cv::findContours()函数在寻找轮廓前通常需要先将图像转换成二值图像。这可以通过阈值化、边缘检测等方法完成。该函数通常返回一个轮廓点集的列表,每个列表中的点集代表一个轮廓。 3. 图像处理 图像处理是使用计算机对图像进行分析和处理的一门技术。它包括许多不同的操作,如图像增强、去噪、二值化、边缘检测、特征提取等。图像处理在医学成像、自动驾驶、视频监控、工业检测等多个领域有广泛应用。 4. C++编程语言 C++是一种广泛使用的编程语言,特别适合系统/应用软件开发和游戏编程。它支持多种编程范式,包括过程化、面向对象和泛型编程。C++具有丰富的库,如STL(标准模板库)和各种第三方库,例如用于图像处理的OpenCV。 5. 版本控制系统 版本控制系统(Version Control System,VCS)是一种软件,用于记录文件和文件集随时间的变化。这样可以跟踪个人和协作项目中的更改,允许开发者恢复到旧版本、查看历史更改和进行分支管理。Git是最流行的版本控制系统之一,而“-master”通常用于指代项目的主分支,即项目的稳定版本或主版本。 通过以上信息,我们可以了解到该资源是一个关于使用cv::findContours()函数的示例项目,该项目被组织在一个使用版本控制系统的项目中,并且是用C++语言编写的。该示例很可能展示了如何在C++项目中集成OpenCV库,通过cv::findContours()函数来提取图像中的轮廓,这在计算机视觉项目中是一个常见的需求。

回答一下代码:import numpy as np import cv2 import Products as product # 加载视频 cap = cv2.VideoCapture("../sample/1.mp4") # 变量 font = cv2.FONT_HERSHEY_SIMPLEX products = [] pid = 1 areaTh = 18000 # 获取图像width, height width = cap.get(3) height = cap.get(3) while cap.isOpened(): ret, frame = cap.read() try: # 复制图片,用于绘制 img = frame.copy() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)[1] except: print("EOF") break # 边缘检测,识别工件 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) for cnt in contours: area = cv2.contourArea(cnt) if area > areaTh: M = cv2.moments(cnt) cx = int(M['m10'] / M['m00']) cy = int(M['m01'] / M['m00']) x, y, w, h = cv2.boundingRect(cnt) new = True if cx > 100: for i in products: if abs(cx - i.getX()) <= 25 and abs(cy - i.getY()) <= 25: new = False i.updateCoords(cx, cy, x, y, w, h) if new: p = product.Product(pid, cx, cy, x, y, w, h) p.save_pic(frame) products.append(p) product.count = pid defects = p.defect_detect() pid += 1 cv2.circle(img, (cx, cy), 5, (0, 0, 255), -1) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) for i in products: # 标记ID if i.getX() <= 600: cv2.putText(img, str(i.getId()), (i.getX(), i.getY()), font, 1.0, i.getRGB(), 1, cv2.LINE_AA) # 绘制缺陷 for j in i.defects: if j.getState() == 1: img = cv2.rectangle(img, (i.getBoundX() + j.getX(), i.getBoundY() + j.getY()), (i.getBoundX() + j.getX() + j.getW() + 5, i.getBoundY() + j.getY() + j.getH() + 5), (0, 255, 255), 1) elif j.getState() == 2: img = cv2.rectangle(img, (i.getBoundX() + j.getX(), i.getBoundY() + j.getY()), (i.getBoundX() + j.getX() + j.getW() + 5, i.getBoundY() + j.getY() + j.getH() + 5), (255, 255, 0), 1) # 绘制sum cv2.putText(img, "sum:" + str(product.count), (10, 30), font, 0.7, (255, 255, 255), 1, cv2.LINE_AA) cv2.putText(img, "scratch_sum:" + str(product.Product.scratch_sum), (10, 50), font, 0.7, (0, 255, 255), 1, cv2.LINE_AA) cv2.putText(img, "blot_sum:" + str(product.Product.blot_sum), (10, 70), font, 0.7, (255, 255, 0), 1, cv2.LINE_AA) cv2.imshow("test", img) k = cv2.waitKey(10) & 0xff if k == 27: break cv2.destroyAllWindows()

2023-02-27 上传