运用OpenCV库findcontours函数的测试代码分享

版权申诉
0 下载量 131 浏览量 更新于2024-11-13 收藏 1.4MB RAR 举报
资源摘要信息:"OpenCV中findContours函数的应用实例" OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它包含了许多常用的图像处理和分析的功能。在OpenCV库中,findContours函数是一个非常重要的图像处理函数,它主要用于寻找二值图像中的轮廓。本文档的标题和描述明确表明了测试代码是针对findContours函数的,而标签“findcontours测试代码”也直接指出了文档内容的核心。 ### 知识点详解: #### 1. findContours函数的作用: findContours函数用于从二值图像中寻找轮廓。所谓二值图像,是指图像的像素点只有黑和白两种颜色,通常情况下,我们将感兴趣的目标设为白色(255),其余部分设为黑色(0)。轮廓就是那些将目标与背景分开的边界线。 #### 2. 函数使用的条件: 在使用findContours函数之前,一般需要先对图像进行预处理,比如二值化处理、滤波去噪等。二值化处理的目的是简化图像,使其更容易被识别和处理。而滤波去噪是为了去除图像中的噪声,提高轮廓检测的准确性。 #### 3. 函数的工作原理: findContours函数根据轮廓的形状特征,从图像中提取出轮廓的坐标点。这些坐标点形成一系列的多边形,用于表示图像中的不同形状。函数可以返回不同层次的轮廓信息,根据需求可以选择是否获取父轮廓和子轮廓。 #### 4. 函数的基本使用方法: 在Python的OpenCV库中,findContours函数的基本调用格式如下: ```python contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) ``` 其中,`image`是输入图像,`mode`参数用于指定轮廓检索模式,`method`参数用于指定轮廓的近似方法,`contours`是输出的轮廓,`hierarchy`是轮廓的层次信息,`offset`是可选的偏移量。 #### 5. 函数的参数详解: - **mode**:有三种模式可选,分别是`RETR_EXTERNAL`(只检索最外围轮廓)、`RETR_LIST`(检索所有轮廓,并保存为列表)、`RETR_TREE`(检索所有轮廓,并构建轮廓树)。 - **method**:有四种方法可选,分别是`CHAIN_APPROX_NONE`(保存所有轮廓点)、`CHAIN_APPROX_SIMPLE`(压缩水平方向的多余点)、`CHAIN_APPROX_TC89_L1`和`CHAIN_APPROX_TC89_KCOS`(使用Teh-Chin链近似算法)。 - **contours**:如果函数返回的是`image, contours`,则可以接收轮廓信息;如果函数返回的是`contours, hierarchy`,则可以直接获取轮廓和层次结构。 - **hierarchy**:层次结构信息,它是一个包含四个值的数组,分别表示后一个轮廓、前一个轮廓、子轮廓和父轮廓的索引。 #### 6. 使用findContours函数时可能遇到的问题: - 图像预处理不充分:如果二值化处理不当,会导致轮廓不完整或轮廓间相互粘连,影响轮廓提取的准确性。 - contour近似方法选择不当:选择错误的轮廓近似方法可能会造成轮廓的过度简化或者信息丢失。 - contour检索模式选择不当:如果选择的检索模式与实际需求不符,可能会导致无法获取正确的轮廓信息。 #### 7. 示例代码解析: ```python import cv2 # 读取图像 image = cv2.imread('test_image.jpg') # 转换为灰度图 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 应用阈值或Canny边缘检测来创建二值图像 _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 寻找轮廓 contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) # 绘制轮廓 cv2.drawContours(image, contours, -1, (0, 255, 0), 3) # 显示结果 cv2.imshow('Contours', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上述代码中,首先读取了一张图像,并转换为灰度图像。接着使用`cv2.threshold`函数将其转换为二值图像。之后调用`cv2.findContours`函数寻找轮廓,并通过`cv2.drawContours`函数将找到的轮廓绘制在原始图像上。最后,通过`cv2.imshow`函数显示带有轮廓的图像。 #### 8. 实际应用: findContours函数广泛应用于机器视觉领域,比如物体的检测与识别、边缘提取、图像分割等。在自动驾驶车辆中,它可以帮助识别车道线;在工业检测中,它可以用于缺陷的检测;在医学图像处理中,它可以用于辅助诊断等。 #### 9. 结语: 本文通过测试代码的形式,详细介绍了OpenCV中findContours函数的使用方法和参数含义,并通过示例代码展示了如何将该函数运用到实际图像处理中。掌握findContours函数对于进行计算机视觉和图像处理工作至关重要。

import cv2 from skimage.feature import hog from sklearn.neighbors import KNeighborsClassifier import joblib import numpy as np # 加载已经训练好的分类器 model_location = "C:/Users/27745/数字图像处理/knn.pkl" knn = joblib.load(model_location) def predict_digit(image): #获取一幅手写数字图像的输入,返回预测结果 # 将图像转换为灰度图 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 应用高斯模糊和大津二值化来预处理图像 blur = cv2.GaussianBlur(gray, (5, 5), 0) _, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # Find the contours and sort them largest-to-smallest contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) contours = sorted(contours, key=lambda ctr: cv2.boundingRect(ctr)[0]) # 提取每个字符的 ROI 并使用 HOG 特征提取方法进行特征提取 features = [] for cnt in contours: (x, y, w, h) = cv2.boundingRect(cnt) # 添加一定的边框,避免过小的ROI被压缩过多而失去特征 border_size = 20 roi = thresh[max(y - border_size, 0):min(y + h + border_size, image.shape[0]), max(x - border_size, 0):min(x + w + border_size, image.shape[1])] # 将ROI调整为28x28大小,并根据特征提取器生成的HOG描述符提取特征 resized_roi = cv2.resize(roi, (28, 28), interpolation=cv2.INTER_AREA) fd = hog(resized_roi, orientations=9, pixels_per_cell=(8, 8), cells_per_block=(2, 2), block_norm='L2-Hys') features.append(fd.reshape(-1, 1)) # 将提取的特征向量输入KNN模型进行预测 results = knn.predict(np.hstack(features)) # 返回数字串预测结果 return ''.join(str(result) for result in results) # 载入测试图片并进行预测 image_name = "C:/Users/27745/Desktop/test1.png" image = cv2.imread(image_name) # 将目标图像统一调整为相同的大小 image = cv2.resize(image, (300, 300)) # 利用封装的函数进行预测 result = predict_digit(image) print("The number is:", result)以上代码出现了X has 216 features, but KNeighborsClassifier is expecting 784 features as input.的问题,请帮我更正

2023-05-24 上传