python 中的 OpenCV 在我尝试在 Sobel 模糊中使用 64F 时抱怨

OpenCV in python complains when i try to use 64F in Sobel blur

我正在尝试使用轮廓制作对象检测工具(给定示例)。

我已经取得了一些进展,但是当对象位于另一个结构复杂的对象(例如手或脸)的前面时,或者对象及其背景在颜色上融合时,它会停止检测边缘和因此没有给出一个好的轮廓。

阅读算法文档后,我发现它的工作原理是通过颜色强度的差异来检测边缘 - 例如,如果物体是黑色的,背景是黑色的,它就不会检测到它。

所以现在我正在尝试应用一些效果和模糊来尝试让它发挥作用。

我目前正在尝试获得组合的 Sobel 模糊(在两个轴上),希望在提供足够的光线的情况下定义边缘 - 因为该产品将由具有闪光灯的手机使用。

所以当我尝试这样做时:

frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
frame = cv2.GaussianBlur(frame, (5, 5), 10)
frameX = cv2.Sobel(frame, cv2.CV_64F, 1, 0)
frameY = cv2.Sobel(frame, cv2.CV_64F, 0, 1)
frame = cv2.bitwise_or(frameX, frameY)

当模式不是 CV_RETR_FLOODFILL 时,我收到一条错误消息说 cv2.findContours 仅支持 CV_8UC1 图像。

这是触发错误的行:

counturs, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

我在 1 周前才开始弄乱这个东西,我很惊讶获得结果是多么容易,但有些错误消息很荒谬。

编辑:我确实尝试将模式切换为 CV_RETR_FLOODFILL,但这并没有解决问题,然后它根本不起作用。

原因是findContours函数需要一个类型为8位整数(uint8)的二进制图像(图像由0和1组成)。开发人员这样做可能是为了减少内存使用,因为用 64 位而不是 8 位存储二进制值没有意义。仅使用

将框架转换为 uint8 类型
frame = np.uint8(frame)