我在python opencv中编写了一个代码.我试图将处理后的图像写回磁盘,但图像没有得到保存,并且没有显示任何错误(运行时和编译)代码是
"""
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)
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我为什么它不起作用.cv2.imshow工作正常(因为它显示正确的图像).谢谢并关心Niladri
Jea*_*bre 15
作为一般和绝对规则,您必须保护您的Windows路径字符串(包含反斜杠)与r前缀或一些字符被解释(例如:\n,\b,\v,\xaaaaand \t,这里的完整列表):
这样做时:
cv2.imwrite('C:\Users\Niladri\Desktop\tropical_image_sig5.bmp', img2)
Run Code Online (Sandbox Code Playgroud)
你想保存到 C:\Users\Niladri\Desktop<TAB>ropical_image_sig5.bmp
(我真的不知道它做了什么:))
做这个:
>>> 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
Run Code Online (Sandbox Code Playgroud)
注意:读取工作正常,因为"转义"大写字母在python 2中没有特别的意义(imread并且imwrite在python 3中有意义所以它不起作用)
正如 Jean 所建议的,错误是由于 \ 被解释为转义序列。因此使用os.path.join()它总是更安全,因为它更跨平台,您不必担心转义序列问题。例如,在您的情况下,您无需担心前几个参数,因为那是您的主目录
import os
cv2.imwrite(os.path.join(os.path.expanduser('~'),'Desktop','tropical_image_sig5.bmp'), img2)
Run Code Online (Sandbox Code Playgroud)
os.path.expanduser('~') 将直接返回您的主目录。