【问题标题】:Ipython cv2.imwrite() not saving imageIpython cv2.imwrite() 不保存图像
【发布时间】:2016-10-19 15:44:23
【问题描述】:

我在 python opencv 中编写了一个代码。我正在尝试将处理后的图像写回磁盘,但图像没有被保存并且没有显示任何错误(运行时和编译)代码是

"""
Created on Wed Oct 19 18:07:34 2016

@author: Niladri
"""

import numpy as np  
import cv2  

if __name__ == '__main__':  
import sys  

img = cv2.imread('C:\Users\Niladri\Desktop\TexturesCom_LandscapeTropical0080_2_S.jpg')
if img is None:  
    print 'Failed to load image file:'
    sys.exit(1)  

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  
h, w = img.shape[:2]  

eigen = cv2.cornerEigenValsAndVecs(gray, 15, 3)  
eigen = eigen.reshape(h, w, 3, 2)  # [[e1, e2], v1, v2]  
#flow = eigen[:,:,2] 
iter_n = 10
sigma = 5
str_sigma = 3*sigma
blend = 0.5
img2 = img
for i in xrange(iter_n):  
    print i,  

    gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)  
    eigen = cv2.cornerEigenValsAndVecs(gray, str_sigma, 3)  
    eigen = eigen.reshape(h, w, 3, 2)  # [[e1, e2], v1, v2]  
    x, y = eigen[:,:,1,0], eigen[:,:,1,1] 
    print eigen

    gxx = cv2.Sobel(gray, cv2.CV_32F, 2, 0, ksize=sigma)  
    gxy = cv2.Sobel(gray, cv2.CV_32F, 1, 1, ksize=sigma)  
    gyy = cv2.Sobel(gray, cv2.CV_32F, 0, 2, ksize=sigma)  
    gvv = x*x*gxx + 2*x*y*gxy + y*y*gyy  
    m = gvv < 0  

    ero = cv2.erode(img, None)  
    dil = cv2.dilate(img, None)  
    img1 = ero  
    img1[m] = dil[m]  
    img2 = np.uint8(img2*(1.0 - blend) + img1*blend)  
#print 'done'
cv2.imshow('dst_rt', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

#cv2.imwrite('C:\Users\Niladri\Desktop\leaf_image_shock_filtered.jpg', img2)    



for i in xrange(iter_n):  
    print i,  

    gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)  
    eigen = cv2.cornerEigenValsAndVecs(gray, str_sigma, 3)  
    eigen = eigen.reshape(h, w, 3, 2)  # [[e1, e2], v1, v2]  
    x, y = eigen[:,:,1,0], eigen[:,:,1,1] 
    print eigen

    gxx = cv2.Sobel(gray, cv2.CV_32F, 2, 0, ksize=sigma)  
    gxy = cv2.Sobel(gray, cv2.CV_32F, 1, 1, ksize=sigma)  
    gyy = cv2.Sobel(gray, cv2.CV_32F, 0, 2, ksize=sigma)  
    gvv = x*x*gxx + 2*x*y*gxy + y*y*gyy  
    m = gvv < 0  

    ero = cv2.erode(img, None)  
    dil = cv2.dilate(img, None)  
    img1 = dil  
    img1[m] = ero[m]  
    img2 = np.uint8(img2*(1.0 - blend) + img1*blend)  
print 'done'

#cv2.imwrite('D:\IP\tropical_image_sig5.bmp', img2)    


cv2.imshow('dst_rt', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

#cv2.imshow('dst_rt', img2)    

cv2.imwrite('C:\Users\Niladri\Desktop\tropical_image_sig5.bmp', img2)

谁能告诉我为什么它不起作用。 cv2.imshow 工作正常(因为它显示了正确的图像)。 谢谢并恭祝安康 尼拉德里

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    作为一般和绝对规则,您必须使用r 前缀或解释某些字符(例如:\n,\b,\v,\x aaaa 和\t,完整列表here):

    所以当这样做时:

    cv2.imwrite('C:\Users\Niladri\Desktop\tropical_image_sig5.bmp', img2)
    

    您正在尝试保存到C:\Users\Niladri\Desktop&lt;TAB&gt;ropical_image_sig5.bmp

    imreadimwrite 的烦人之处在于,这些函数不会在错误时抛出异常,而是默默地失败。 imwrite 返回False

    >>> cv2.imread("D:/nonexisting.jpg")  # this returns None, no error
    >>> s = cv2.imread("D:/sloth_book.jpg")  # this works
    >>> s
    array([[[250, 250, 250],
            [246, 246, 246],
            [255, 255, 255],
            ...,
    >>> cv2.imwrite("inexistent_dir/file.jpg",s)  # dir doesn't exist, write fails
    False
    

    所以你必须检查这些函数的返回值。

    这样做:

    if not cv2.imwrite(r'C:\Users\Niladri\Desktop\tropical_image_sig5.bmp', img2):
         raise Exception("Could not write image")
    

    注意:读取工作正常,因为“转义”大写字母在 python 2 中没有特殊含义(\U\N 在 python 3 中有意义,所以它不会起作用)

    如果出现错误,程序现在会大声抱怨。

    【讨论】:

      【解决方案2】:

      正如 Jean 所建议的,错误是由于 \ 被解释为转义序列。因此使用os.path.join() 总是更安全,因为它更跨平台,您不必担心转义序列问题。例如,在您的情况下,您不必担心前几个参数,因为那是您的主目录

      import os
      cv2.imwrite(os.path.join(os.path.expanduser('~'),'Desktop','tropical_image_sig5.bmp'), img2)
      

      os.path.expanduser('~') 将直接返回您的主目录。

      【讨论】:

      • 可能是最便携的解决方案
      【解决方案3】:

      如果您想让代码中的路径可移植,请查看 pathlib。

      https://docs.python.org/3/library/pathlib.html

      【讨论】:

        猜你喜欢
        • 2020-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        相关资源
        最近更新 更多