opencv - 为什么 cv2.seamlessClone 抛出错误'(-215:断言失败)'?
问题描述
我有 3 张图像(背景、前景、前景蒙版)
并且所有图像都具有相同的大小
当我运行下面的代码时,它会抛出错误:
错误:OpenCV(3.4.2) C:\Miniconda3\conda-bld\opencv-suite_1534379934306\work\modules\core\src\matrix.cpp:465: error: (-215:Assertion failed) 0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows in function '简历::垫::垫'
代码 :
import cv2
import numpy as np
mask=cv2.imread('mask.jpg',0)
bg=cv2.imread('bg.jpg')
fg=cv2.imread('fg.jpg')
_, contours,_= cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
c = max(contours, key = cv2.contourArea)
x,y,w,h = cv2.boundingRect(c)
center = (int(x+w*0.5),int(y+h*0.5))
output = cv2.seamlessClone(fg, bg, mask, center, cv2.NORMAL_CLONE)
cv2.imshow('sss',output)
cv2.waitKey(0)
cv2.destroyAllWindows()
谁能帮我 ?
谢谢 :)
解决方案
您收到此错误是因为掩码的某些像素超出了bg
和fg
。要解决此问题,您可以为所有值为 0 的图像添加边框。
您更新的代码将如下所示。我没有从输出图像中删除边框。您可以根据需要删除它。
import cv2
import numpy as np
mask = cv2.imread('mask.png', 0)
bg = cv2.imread('bg.png')
fg = cv2.imread('fg.png')
top, bottom, left, right = 20, 20, 20, 20
border_bg = cv2.copyMakeBorder(bg, top, bottom, left, right, cv2.BORDER_CONSTANT, value=[0, 0, 0])
border_fg = cv2.copyMakeBorder(fg, top, bottom, left, right, cv2.BORDER_CONSTANT, value=[0, 0, 0])
border_mask = cv2.copyMakeBorder(mask, top, bottom, left, right, cv2.BORDER_CONSTANT, value=0)
contours, _ = cv2.findContours(border_mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
c = max(contours, key=cv2.contourArea)
x, y, w, h = cv2.boundingRect(c)
center = (int(x + w * 0.5), int(y + h * 0.5))
output = cv2.seamlessClone(border_bg, border_fg, border_mask, p=center, flags=cv2.NORMAL_CLONE)
cv2.imshow("border_mask", border_mask)
cv2.imshow("border_bg", border_bg)
cv2.imshow("border_fg", border_fg)
cv2.imshow('output', output)
cv2.waitKey(0)
cv2.destroyAllWindows()
推荐阅读
- javascript - 如何制作网站打印pdf的打印布局?
- feathersjs - FeathersJs 上的 Axios 补丁没有身份验证令牌
- r - 按年订购 facet_wrap 绘图的更简单方法
- python - 如何使用 python-redis 检查 redis-database 中是否存在值
- python - 使用带有列表和字典的字典中的 Django 模板显示一些值
- excel - 如果单元格为空白,则移动到另一个单元格,否则为 TODAY()-单元格
- java - Equinox 无法解析 org.eclipse.osgi.services 和 org.eclipse.equinox.cm
- angular - 将 HTML 字符串转换为 Angular 组件
- java - 类似于 IntelliJ 的 Eclipse count.fori 代码模板/后缀补全
- powerbi - 按季度的年度移动平均值(Power Bi)