- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在 python (3.6.5) 中使用 openCV (3.3.1) 将我制作的蒙版应用于图像以提取所有皮肤。我正在循环查看一张照片并检查窗口并使用两个预制的 sklearm GMM 对它们进行分类。如果窗口是皮肤,我将蒙版的那个区域更改为 True (255),否则将其保留为 0。
我已经初始化了 numpy 数组以在循环之前将掩码保存为与图像相同的尺寸,但是 openCV 一直说图像和掩码没有相同的尺寸(输出和错误消息如下)。我在网站上看到过其他类似的问题,但没有一个解决方案对我有用。
这是我的代码:
# convert the image to hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
delta = 6
# create an empty np array to make the mask
#mask = np.zeros((img.shape[0], img.shape[1], 1))
mask = np.zeros(img.shape[:2])
# loop through image and classify each window
for i in range(0,hsv.shape[0],delta):
for j in range(0,hsv.shape[1],delta):
# get a copy of the window
arr = np.copy(hsv[i:i+delta,j:j+delta,0])
# create a normalized hue histogram for the window
if arr.sum() > 0:
arr = np.histogram(np.ravel(arr/arr.sum()), bins=100, range=(0,1))
else:
arr = np.histogram(np.ravel(arr), bins=100, range=(0,1))
# take the histogram and reshape it
arr = arr[0].reshape(1,-1)
# get the probabilities that the window is skin or not skin
skin = skin_gmm.predict_proba(arr)
not_skin = background_gmm.predict_proba(arr)
if skin > not_skin:
# becasue the window is more likely skin than not skin
# we fill that window of the mask with ones
mask[i:i+delta,j:j+delta].fill(255)
# apply the mask to the original image to extract the skin
print(mask.shape)
print(img.shape)
masked_img = cv2.bitwise_and(img, img, mask = mask)
输出是:
(2816, 2112)
(2816, 2112, 3)
OpenCV Error: Assertion failed ((mtype == 0 || mtype == 1) &&
_mask.sameSize(*psrc1)) in cv::binary_op, file C:\ci\opencv_1512688052760
\work\modules\core\src\arithm.cpp, line 241
Traceback (most recent call last):
File "skindetector_hist.py", line 183, in <module>
main()
File "skindetector_hist.py", line 173, in main
skin = classifier_mask(img, skin_gmm, background_gmm)
File "skindetector_hist.py", line 63, in classifier_mask
masked_img = cv2.bitwise_and(img, img, mask = mask)
cv2.error: C:\ci\opencv_1512688052760\work\modules\core\src
\arithm.cpp:241: error: (-215) (mtype == 0 || mtype == 1) &&
_mask.sameSize(*psrc1) in function cv::binary_op
如您在输出中所见,图像和蒙版具有相同的宽度和高度。我也试过使蒙版的深度为 1(第 5 行),但这没有帮助。感谢您的帮助!
最佳答案
不仅提示面具的大小。它提示面具的类型。错误:
OpenCV Error: Assertion failed ((mtype == 0 || mtype == 1) && _mask.sameSize(*psrc1))
表示掩码的类型或大小(在您的情况下是相等的)不相同。在documentation我们看到:
mask – optional operation mask, 8-bit single channel array, that specifies elements of the output array to be changed.
这与要求类型 0 (CV_8U) 或 1 (CV_8S) 的错误一致。
另外,即使没有说明,img 也不应该是 float 的,因为它不会给出预期的结果(可能它无论如何都会这样做)。
解决方案可能足以更改:
mask = np.zeros(img.shape[:2])
到
mask = np.zeros(img.shape[:2], dtype=np.uint8)
一个小测试显示您将获得什么类型:
np.zeros((10,10)).dtype
给你 dtype('float64')
这意味着加倍而不是 8 位
关于python - OpenCV 错误 : bitwise_and throws error that mask and image are not same size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50957151/
考虑以下 numpy 数组: x = np.array([2]*4, dtype=np.uint8) 这只是一个由四个 2 组成的数组。 我想对该数组执行按位与缩减: y = np.bitwise_a
我正在尝试使用 bitwise_and 以根据阈值排除图像的所有其余部分,但是当我尝试时它给出: OpenCV Error: Sizes of input arguments do not match
我的程序使用 boost::simd。奇怪的是,与不使用 boost::simd 相比,整个程序实际上运行得更慢。我设法找到了导致绝大多数 CPU 运行时间的行: using pack_t = boo
ufunc.reduce因为 numpy.bitwise_and.reduce 似乎表现不正常……我是在滥用它吗? >>> import numpy as np >>> x = [0x211f,0x1
我想了解函数 cv2.bitwise_and(src1,src2,mask) 的工作原理。所以我尝试了这段代码: src1=np.array([1, 2, 3]) src1=np.uint8(src1
我正在尝试编写一个脚本来剪掉你的脸并使所有暗像素变成全黑。我首先使用 haarcascade 来识别人脸。然后我根据 haarcascade 的坐标创建一个 roi(感兴趣区域)。之后,我使用范围内过
我不完全理解在 openCV 中使用“bitwise_and”运算符时的作用。我也想知道它的参数。 最佳答案 一般用法是您想要获取由另一个图像定义的图像的子集,通常称为“掩码”。 假设您要“抓取”8x
如何在 Emgu 中使用 Bitwise_and 函数?我在 Emgu 维基中找到它 Bitwise_and但我不知道怎么调用它! 我正在尝试将该代码从 C++ 转换为 C# Tuto 最佳答案 查看
我正在这段代码片段中尝试 numba from numba import jit import numpy as np from time import time db = np.array(np.
我正在尝试从图像中提取棋盘。它有很多我想删除的其他不需要的内容。所以我创建了一个包含所有斜坡的面具。然后将其与原始灰度图像进行bitwise_and。我是新手,我发现 OpenCV 非常有趣,但我遇到
我正在尝试在 python (3.6.5) 中使用 openCV (3.3.1) 将我制作的蒙版应用于图像以提取所有皮肤。我正在循环查看一张照片并检查窗口并使用两个预制的 sklearm GMM 对它
我正在尝试提取输入图像的蓝色。为此,我使用命令创建了一个蓝色的 HSV 颜色边界和阈值 HSV 图像 mask_img = cv2.inRange(hsv, lower_blue, upper_blu
我试过在不同的网站上搜索解释,但我没有得到一个完整解释的答案。 import cv2 import numpy as np img1 = cv2.imread('3D-Matplotlib.png')
我是一名优秀的程序员,十分优秀!