Ipython cv2.imwrite()不能保存图像

您所在的位置:网站首页 python保存后无法运行 Ipython cv2.imwrite()不能保存图像

Ipython cv2.imwrite()不能保存图像

#Ipython cv2.imwrite()不能保存图像| 来源: 网络整理| 查看: 265

百度翻译此文   有道翻译此文 问题描述

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

推荐答案

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\Desktopropical_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.



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3