matlab.engine.EngineError: 无法连接到 MATLAB 会话 'MATLAB_13144'。
我是在python中调用matlab.engine出现这个bug,这段代码的主函数如下:
if __name__ == '__main__':
img1_dir = "D:\projectworkspace\\pythonworkspace\\SRdeep_prior\\final results\\book\\Original.png"
img2_dir = "D:\projectworkspace\\pythonworkspace\\SRdeep_prior\\final results\\book\\SRCNN_Reconstruction.png"
img1 = np.array(Image.open(img1_dir))
img2 = np.array(Image.open(img2_dir))
CI = ComputeIndex(img1, img2, img1_dir, img2_dir)
print("PSNR:%5f(dB); SSIM:%0.8f; real1_NIQE:%0.5f; bicubic1_NIQE:%0.5f" % (CI.psnr(), CI.ssim(), CI.niqe()[0],
CI.niqe()[1]))
在调用CI.niqe()时,由于NIQE的计算是由matlab脚本计算,故我用到了matlab.engine。niqe的定义如下:
def niqe(self):
if self.img1_dir is None or self.img2_dir is None:
assert False, " Don't have image directory, please check input parameters."
else:
eng = matlab.engine.connect_matlab()
# print('matlab process name: ', matlab.engine.find_matlab())
eng.addpath('perceptualmetric')
img_dir = [self.img1_dir, self.img2_dir]
niqe_list = []
for img in img_dir:
niqe_list.append(eng.calc_NIQE(img, 4))
return niqe_list
出现这个问题的原因在于,在CI.niqe[0]时已经连接了matlab的会话(session)。如果再在CI.niqe()[1]中去调用niqe函数就会导致前一个会话未终止,又开始调用这个会话。所以出现无法连接的错误。(在一个matlab会话未结束时有又想开始新会话)
解决方法就是在print之前只调用一次niqe函数,让它的列表直接返回出来即可。即不要在print里调用两次CI.niqe()。
if __name__ == '__main__':
img1_dir = "D:\projectworkspace\\pythonworkspace\\SRdeep_prior\\final results\\book\\Original.png"
img2_dir = "D:\projectworkspace\\pythonworkspace\\SRdeep_prior\\final results\\book\\SRCNN_Reconstruction.png"
img1 = np.array(Image.open(img1_dir))
img2 = np.array(Image.open(img2_dir))
CI = ComputeIndex(img1, img2, img1_dir, img2_dir)
niqe = CI.niqe()
print("PSNR:%5f(dB); SSIM:%0.8f; real1_NIQE:%0.5f; bicubic1_NIQE:%0.5f" % (CI.psnr(), CI.ssim(), niqe[0],
niqe[1]))