Niladri Chakraborty Niladri Chakraborty - 1 month ago 25
Python Question

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

Answer

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

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 I really don't know what it does :))

Do this:

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

Note: the read works fine because "escaped" uppercase letters have no particular meaning in python 2 (\U has a meaning in python 3)

Comments