简体   繁体   English

Ipython cv2.imwrite()不保存图像

[英]Ipython cv2.imwrite() not saving image

I have written a code in python opencv. 我在python opencv中编写了一个代码。 I am trying to write the processed image back to disk but the image is not getting saved and it is not showing any error(runtime and compilation) The code is 我试图将处理后的图像写回磁盘,但图像没有得到保存,并且没有显示任何错误(运行时和编译)代码是

"""
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)

Can anyone please tell me why it is not working. 任何人都可以告诉我为什么它不起作用。 cv2.imshow is working properly(as it is showing the correct image). cv2.imshow工作正常(因为它显示正确的图像)。 Thanks and Regards Niladri 谢谢并关心Niladri

As a general and absolute rule, you have to protect your windows path strings (containing backslashes) with r prefix or some characters are interpreted (ex: \\n,\\b,\\v,\\x aaaaand \\t , full list here ): 作为一般和绝对规则,您必须使用r前缀保护您的Windows路径字符串(包含反斜杠)或解释一些字符(例如: \\n,\\b,\\v,\\x \\t aaaa和\\t此处为完整列表):

so when doing this: 这样做时:

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

you're trying to save to C:\\Users\\Niladri\\Desktop<TAB>ropical_image_sig5.bmp 你正试图保存到C:\\Users\\Niladri\\Desktop<TAB>ropical_image_sig5.bmp

And the annoying thing with imread and imwrite is that those functions don't throw exceptions on errors, but fail silently. imreadimwrite令人讨厌的事情是这些函数不会在错误上抛出异常,而是默默地失败。 imwrite returns False 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

So you have to check return value of those functions. 所以你必须检查这些函数的返回值。

Do this: 做这个:

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

Note: the read works fine because "escaped" uppercase letters have no particular meaning in python 2 ( \\U and \\N have a meaning in python 3 so it wouldn't have worked) 注意:读取工作正常,因为“转义”大写字母在python 2中没有特别的意义( \\U\\N在python 3中有意义所以它不起作用)

And if there's an error, the program now complains loudly. 如果出现错误,程序现在会大声抱怨。

As Jean suggested, the error is due to the \\ being interpretted as an escape sequence. 正如Jean所说,错误是由于\\被解释为转义序列。 It is hence always safer to use os.path.join() as it is more cross platform and you need not worry about the escape sequence problem. 因此,使用os.path.join()总是更安全,因为它更加跨平台,您不必担心转义序列问题。 For instance, in your case, you further need not worry about the first few arguments, as that is your home directory 例如,在您的情况下,您还需要担心前几个参数,因为这是您的主目录

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

os.path.expanduser('~') will directly return your home directory. os.path.expanduser('~')将直接返回您的主目录。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM