使用opencv跟踪边界
tracking boundary using opencv
我正在尝试从以下二进制图像中按顺序跟踪/追踪边界点:
我正在使用 OpenCV (python)。我正在使用三种方式:
- 应用Canny边缘检测来检测边缘。问题是如何得到点的序列?它工作正常但是很难得到边界点的序列
- 理想的选择是检测二值图像上的轮廓。因为 contours return 边界点按顺序排列。但是 openCV 轮廓方法没有检测到结果中所示的边界。为什么会这样?
- 检测 Canny 边缘上的轮廓。还是漏掉了一些边界??
谁能帮我看看 OpenCV 轮廓是怎么回事?为什么它没有跟踪完整的边界。我检测轮廓如下:
contours, hierarchy = cv2.findContours(thresh1,cv2.RETR_TREE ,cv2.CHAIN_APPROX_SIMPLE)
其中 thresh1 是二值图像
考虑到你的轮廓很简单,我不确定你为什么要使用 RETR_TREE,因为没有嵌套轮廓。您是否尝试过使用 RETR_EXTERNAL 代替?
来自 OpenCV 文档:
CV_RETR_TREE retrieves all of the contours and reconstructs a full hierarchy of nested contours.
CV_RETR_EXTERNAL retrieves only the extreme outer contours.
此外,请注意 CHAIN_APPROX_SIMPLE 将 不会 枚举边界上的所有点,它会尝试简化轮廓,特别是它不会 return 多个连续的水平、垂直或对角线点。如果您想要所有点,请使用 CV_CHAIN_APPROX_NONE 这将强制轮廓算法找到所有边界点。
CV_CHAIN_APPROX_SIMPLE compresses horizontal, vertical, and diagonal seg- ments and leaves only their end points. For example, an up-right rectangular contour is encoded with 4 points.
CV_CHAIN_APPROX_NONE stores absolutely all the contour points.
以下代码适用于您的图像并找到 132 个点:
// Load original image as grey scale
Mat image = imread("imagename.png", IMREAD_GRAYSCALE);
vector<vector<Point>> contours;
Mat hierarchy;
findContours(image, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
将 CV_CHAIN_APPROX_SIMPLE 换成 CV_CHAIN_APPROX_NONE 会得到一个包含 737 个点的轮廓 return。
您没有包含代码的完整上下文,但请注意 findContours 确实会修改源图像,因此如果您使用同一源图像连续进行多次调用,则可能需要注意这一点。
我正在尝试从以下二进制图像中按顺序跟踪/追踪边界点:
我正在使用 OpenCV (python)。我正在使用三种方式:
- 应用Canny边缘检测来检测边缘。问题是如何得到点的序列?它工作正常但是很难得到边界点的序列
- 理想的选择是检测二值图像上的轮廓。因为 contours return 边界点按顺序排列。但是 openCV 轮廓方法没有检测到结果中所示的边界。为什么会这样?
- 检测 Canny 边缘上的轮廓。还是漏掉了一些边界??
谁能帮我看看 OpenCV 轮廓是怎么回事?为什么它没有跟踪完整的边界。我检测轮廓如下:
contours, hierarchy = cv2.findContours(thresh1,cv2.RETR_TREE ,cv2.CHAIN_APPROX_SIMPLE)
其中 thresh1 是二值图像
考虑到你的轮廓很简单,我不确定你为什么要使用 RETR_TREE,因为没有嵌套轮廓。您是否尝试过使用 RETR_EXTERNAL 代替?
来自 OpenCV 文档:
CV_RETR_TREE retrieves all of the contours and reconstructs a full hierarchy of nested contours.
CV_RETR_EXTERNAL retrieves only the extreme outer contours.
此外,请注意 CHAIN_APPROX_SIMPLE 将 不会 枚举边界上的所有点,它会尝试简化轮廓,特别是它不会 return 多个连续的水平、垂直或对角线点。如果您想要所有点,请使用 CV_CHAIN_APPROX_NONE 这将强制轮廓算法找到所有边界点。
CV_CHAIN_APPROX_SIMPLE compresses horizontal, vertical, and diagonal seg- ments and leaves only their end points. For example, an up-right rectangular contour is encoded with 4 points.
CV_CHAIN_APPROX_NONE stores absolutely all the contour points.
以下代码适用于您的图像并找到 132 个点:
// Load original image as grey scale
Mat image = imread("imagename.png", IMREAD_GRAYSCALE);
vector<vector<Point>> contours;
Mat hierarchy;
findContours(image, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
将 CV_CHAIN_APPROX_SIMPLE 换成 CV_CHAIN_APPROX_NONE 会得到一个包含 737 个点的轮廓 return。
您没有包含代码的完整上下文,但请注意 findContours 确实会修改源图像,因此如果您使用同一源图像连续进行多次调用,则可能需要注意这一点。