如何正确使用 cv2.imwrite 通过 cv2.selectROI 在 openCV 中保存图像
Posted
技术标签:
【中文标题】如何正确使用 cv2.imwrite 通过 cv2.selectROI 在 openCV 中保存图像【英文标题】:How to correctly use cv2.imwrite to save an image in openCV with cv2.selectROI 【发布时间】:2018-02-07 08:51:00 【问题描述】:我正在试用 OpenCV 的 ROI 功能。有了这个,我试图裁剪出我加载的图像的一部分。之后,我试图保存图像并显示它。显示它不是什么大问题,但保存它是。图像被存储为一个大的黑色矩形,而不是实际裁剪的图像。这是我的代码:
import cv2
import numpy as np
from skimage.transform import rescale, resize
if __name__ == '__main__' :
# Read image
im = cv2.imread("/Path/to/Image.jpg")
img = resize(im, (400,400), mode='reflect')
# Select ROI
r = cv2.selectROI(img)
# Crop image
imCrop = img[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])]
# Save first, then Display cropped image
cv2.imwrite("../../Desktop/Image.jpg", imCrop) # This is where there seems to be a problem
cv2.imshow("im", imCrop)
cv2.waitKey(0)
有人可以帮忙吗?
【问题讨论】:
你能检查imCrop
的内容吗?它是整数还是浮点数(介于 0 和 1 之间)。也只是为了超级确定,您可以尝试将写入格式指定为 jpeg 吗?
它是一个介于 0 和 1 之间的浮点数,我将它设为 0 到 255。
这样就成功了吗?
能否调试r = cv2.selectROI(img)
的值,同时附上cv2.imshow()
的输出?
@UG_ 是的,确实如此。 dtype 应设置为 uint8。
【参考方案1】:
cv2.selectROI
返回类似于cv2.boundingRect()
的矩形的(x,y,w,h)
值。我的猜测是,保存的黑色矩形是由于将边界框坐标转换为 int
类型时的舍入问题。所以直接解压(x,y,w,h)
坐标,使用Numpy切片来提取ROI。这是提取和保存 ROI 的最小工作示例:
输入图像->
提取ROI的程序->
保存的ROI
代码
import cv2
image = cv2.imread('1.jpg')
(x,y,w,h) = cv2.selectROI(image)
ROI = image[y:y+h, x:x+w]
cv2.imshow("ROI", ROI)
cv2.imwrite("ROI.png", ROI)
cv2.waitKey()
【讨论】:
以上是关于如何正确使用 cv2.imwrite 通过 cv2.selectROI 在 openCV 中保存图像的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV Python:如何避免 py3 中的 cv2.imwrite() 内存“泄漏”?
cv2.rectangle()、cv2.putText()和cv2.imwrite()用法
OpenCV 函数学习02-图像的保存(cv2.imwrite)