如何正确使用 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 imwrite 和德语字母(“ä, ü, ö”)

cv2.rectangle()、cv2.putText()和cv2.imwrite()用法

OpenCV 函数学习02-图像的保存(cv2.imwrite)

CV2(cv2.imwrite)- Python 不断抛出“断言失败”错误

Python+OpenCV:cv2.imwrite