'Ipython cv2.imwrite() not saving image
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
Solution 1:[1]
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.
Solution 2:[2]
As Jean suggested, the error is due to the \ being interpreted 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.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | Jean-François Fabre |