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



我正在尝试使用轮廓制作一个对象检测工具(给定样本(。

我有一些进展,但是当物体在另一个具有复杂结构的物体(例如手或脸(的前面时,或者物体及其背景在颜色上融合时,它会停止检测边缘,因此不能给出良好的轮廓。

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

所以现在我正在尝试应用一些效果和模糊来尝试使其工作。

我目前正在尝试组合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函数需要一个二进制图像(图像由 0 和 1 组成(,其类型为 8 位整数 (uint8(。开发人员可能这样做是为了减少内存使用量,因为存储 64 位而不是 8 位的二进制值是没有意义的。只需使用 将框架转换为uint8类型

frame = np.uint8(frame)

相关内容

  • 没有找到相关文章

最新更新