python - 无法使用 OpenCV3 找到轮廓,但代码可在 OpenCV2 上运行

标签 python opencv contour

这是不起作用的代码:

original_image = cv2.imread(test_image,cv2.IMREAD_GRAYSCALE);
bin_ada = cv2.adaptiveThreshold(original_image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,43,0);
img,contours, hierachy = cv2.findContours(bin_ada,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE,(0,0));

这是有效的代码:

original_image = cv2.imread(test_image,cv2.IMREAD_GRAYSCALE);
bin_ada = cv2.adaptiveThreshold(original_image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,43,0);
contours, hierachy = cv2.findContours(bin_ada,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE,(0,0));

区别在于第一个代码使用 Python3 和较新的 OpenCV 库 (3.4.1) 运行,而第二个代码使用 Python2 和较旧的 OpenCV 库 (2.4.5) 运行。

这是一个错误吗?或者是否有关于为什么第一段代码不起作用的简单解释?

错误是这样的:

OpenCV(3.4.1) /io/opencv/modules/imgproc/src/contours.cpp:1894: error: (-215) _contours.empty() || (_contours.channels() == 2 && _contours.depth() == 4) in function findContours

如果有任何帮助,我将不胜感激

最佳答案

您不需要 findContours 的最后一个参数,它是一个偏移量并且您设置为 (0,0)(如果您确实需要偏移量,请使用 offset=(y,x))。

此代码适用于 python 3.6.3 和 opencv 3.4

import cv2
import numpy as np

original_image = cv2.imread("./1.jpeg",cv2.IMREAD_GRAYSCALE);
bin_ada = cv2.adaptiveThreshold(original_image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,43,0);
img,contours, hierachy = cv2.findContours(bin_ada,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE);

关于python - 无法使用 OpenCV3 找到轮廓,但代码可在 OpenCV2 上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50965085/

相关文章:

python - 从图像中提取和保存字符

python - 如何选择由 numpy 数组表示的图像中轮廓内的像素?

python - 绘制显示粒子百分比的等高线

python - sympy:如何保存 "solve"处的解决方案以供重复使用?

python - max() 的不同面孔

javascript - cv::imcode将图像从JS解码到C++(opencv,emscripten)

python - 如何获得每个边界点与霍夫线之间的垂直距离?

Python:如何使用类方法子类化一个类

python - Anaconda 在 TravisCI for python 2.7 上构建故障处理程序的轮子失败

python - 在树莓派 : can't find packages 上安装 OpenCV