当我尝试在 Sobel 模糊中使用 64F 时,Python 中的 OpenCV 会抱怨

Sup*_*ple 0 python opencv 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)
Run Code Online (Sandbox Code Playgroud)

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

这是触发错误的行:

counturs, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
Run Code Online (Sandbox Code Playgroud)

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

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

aes*_*ari 5

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

frame = np.uint8(frame)
Run Code Online (Sandbox Code Playgroud)