cv::findContours(canny_result, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE, cv::Point(0, 0));
时间: 2024-06-02 21:12:06 浏览: 115
这行代码是使用 OpenCV 库中的函数 cv::findContours() 来查找二值化图像中的轮廓(contours)。其中 canny_result 是输入的二值化图像,contours 是存储输出轮廓的向量(vector),hierarchy 是输出轮廓的层次结构,RETR_EXTERNAL表示只检测外轮廓,CHAIN_APPROX_NONE表示不进行轮廓近似,最后一个参数是轮廓偏移量。这个函数的作用是将输入的二值化图像中的所有轮廓找出来,并将它们存储在 contours 向量中。
相关问题
opencv python 图像处理 使用高斯滤波+cv2.adaptiveThreshold+canny算法 进行轮廓提取得到contours 在contours提取出面积不小于一定阈值threshold_area且两边接近平行于x轴、两边接近平行于y轴的矩形轮廓contour_rec 同时进行霍夫变化cv2.HoughLinesP得到直线lines 遍历lines 得到x1, y1, x2, y2 ,然后计算直线的斜率:slope = abs((y2 - y1) / (x2 - x1 + 0.001)) # 防止分母为0 通过直线的斜率筛选出相对水平与相对垂直的线:if slope > 5.5 or slope<0.17: # 如果斜率大于5.5,则认为是垂直线段 用筛选出相对水平与相对垂直的线去与对比矩形轮廓 若直线大部分与轮廓贴合 则画出该轮廓 能帮我用代码示例嘛
当然可以,以下是代码示例:
```
import cv2
import numpy as np
# 读取图像
img = cv2.imread('test.jpg')
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 高斯滤波
blur = cv2.GaussianBlur(gray, (5, 5), 0)
# 自适应阈值化
th = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 11, 2)
# Canny边缘检测
edges = cv2.Canny(th, 30, 150)
# 轮廓提取
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 遍历轮廓
for contour in contours:
# 计算轮廓面积
area = cv2.contourArea(contour)
# 过滤面积小于阈值的轮廓
if area < threshold_area:
continue
# 计算轮廓外接矩形
rect = cv2.minAreaRect(contour)
box = cv2.boxPoints(rect)
box = np.int0(box)
# 计算外接矩形的长宽
width = rect[1][0]
height = rect[1][1]
# 过滤长宽比例不合适的矩形
if width / height > 5 or height / width > 5:
continue
# 霍夫变换检测直线
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 50, minLineLength=50, maxLineGap=10)
# 遍历直线
for line in lines:
x1, y1, x2, y2 = line[0]
# 计算直线斜率
slope = abs((y2 - y1) / (x2 - x1 + 0.001))
# 过滤斜率不合适的直线
if slope > 5.5 or slope < 0.17:
continue
# 判断直线是否与矩形贴合
if abs(y2 - y1) > abs(x2 - x1):
# 直线接近水平,判断是否与矩形上下两条边贴合
if abs(y1 - box[0][1]) < 10 or abs(y1 - box[1][1]) < 10:
# 绘制矩形
cv2.drawContours(img, [box], 0, (0, 0, 255), 2)
break
else:
# 直线接近垂直,判断是否与矩形左右两条边贴合
if abs(x1 - box[0][0]) < 10 or abs(x1 - box[1][0]) < 10:
# 绘制矩形
cv2.drawContours(img, [box], 0, (0, 0, 255), 2)
break
# 显示结果
cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这段代码中需要自己定义阈值`threshold_area`,表示过滤掉面积小于该值的轮廓。
myutils.sort_contours 一直报错
如果你使用myutils.sort_contours()函数出现了错误,可能是因为该函数没有正确导入或者函数参数有误。这个函数是自定义的,可能需要在代码中进行定义,所以你需要确保已正确导入该函数,并且正确传递了轮廓列表和排序标准参数。
以下是一个可能的实现示例,其中函数参数包括轮廓列表(contours)和排序标准(sorting_criteria):
```
import cv2
def sort_contours(contours, sorting_criteria):
reverse = False
i = 0
if sorting_criteria == "left-to-right":
i = 1
elif sorting_criteria == "top-to-bottom":
i = 0
reverse = True
bounding_boxes = [cv2.boundingRect(c) for c in contours]
(contours, bounding_boxes) = zip(*sorted(zip(contours, bounding_boxes),
key=lambda b: b[1][i], reverse=reverse))
return contours, bounding_boxes
```
在使用该函数时,你需要传递轮廓列表和排序标准。例如,以下是一个使用“从左到右”标准对轮廓进行排序的示例:
```
import cv2
import myutils
image = cv2.imread("example.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edged = cv2.Canny(gray, 50, 100)
contours, hierarchy = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours, bounding_boxes = myutils.sort_contours(contours, "left-to-right")
for c in contours:
cv2.drawContours(image, [c], -1, (0, 255, 0), 2)
cv2.imshow("Sorted Contours", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
请确保在代码中正确导入myutils模块,并将myutils.sort_contours()函数定义在该模块中。如果你仍然遇到问题,请提供更多的错误信息和代码细节,以便更好地解决问题。
阅读全文