Ipython cv2.imwrite() not saving image
Question: 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)

