Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ipython cv2.imwrite() not saving image

Tags:

python

opencv

I have written a code in 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). Thanks and Regards Niladri

like image 561
Niladri Chakraborty Avatar asked Oct 19 '16 15:10

Niladri Chakraborty


People also ask

Does cv2 Imwrite overwrite?

imwrite will overwrite existing files without outputting an error or asking for confirmation. Image of any format can be saved using this method.

Does cv2 Imwrite compress?

Save Image to File in JPEG Format This is because cv2. imwrite() has the ability to compress the image while writing it into the file.

What does cv2 Imwrite return?

imwrite() returns a boolean value. True if the image is successfully written and False if the image is not written successfully to the local path specified.


2 Answers

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

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

And the annoying thing with imread and imwrite is that those functions don't throw exceptions on errors, but fail silently. imwrite returns 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)

And if there's an error, the program now complains loudly.

like image 98
Jean-François Fabre Avatar answered Sep 30 '22 17:09

Jean-François Fabre


As Jean suggested, the error is due to the \ being interpretted as an escape sequence. 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. 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.

like image 24
R. S. Nikhil Krishna Avatar answered Sep 30 '22 16:09

R. S. Nikhil Krishna