最新做一个项目,需要Java调用我们用Python写的接口,print 结果以后,他那边通过流获取,再展示。
具体步骤如下:
1 python 使用 argParse 传入参数
OpenCV2获取轮廓主要是用cv2.findContours
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbosity", help="increase output verbosity")
# 上面一句是添加参数
args = parser.parse_args()
if args.verbosity:
image=image_cut(args.verbosity)
#image_cut是示例方法,我们到时候就调用执行这个方法,args.verbosity是获取的输入参数
print(image.shape)
argparse 是python 的获取参数方法,具体看参考他的博客:python argparse用法总结
2 使用Python解释器在CMD执行
当编写好Python后,存为.py文件,这时我们需要在cmd中执行,同时,为了保证在哪里都能执行,我用了绝对路径
python d:/Code/digitalOCR/image_cut.py -v "D:/Code/digitalOCR/scan1.jpg"
#特别注意的是,参数后的路径需要双引号!以前我用双引号,在IDE可以执行,但是在cmd中不能执行,很奇怪!
3 Java获取python 的输出
通过Java调用cmd,即可获得Python的输出,其实还有其他方法调用Python ,但是我的Python中调用了第三方的包,如tensorflow,其他方法会报错,说无法引用tensflowflow。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class hello2
{
public static void main(String[] args)
{
Process p;
//test.bat中的命令是ipconfig/all
String cmd="python d:/Code/digitalOCR/image_cut.py -v \"D:/Code/digitalOCR/scan1.jpg\"";
System.out.println(cmd);
try
{
//执行命令
p = Runtime.getRuntime().exec(cmd);
//取得命令结果的输出流
InputStream fis=p.getInputStream();
//用一个读输出流类去读
InputStreamReader isr=new InputStreamReader(fis);
//用缓冲器读行
BufferedReader br=new BufferedReader(isr);
String line=null;
//直到读完为止
while((line=br.readLine())!=null)
{
//System.out.println(line);
ArrayList List = new ArrayList();
List.add(line);
System.out.println(List);
System.out.println("ok");
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
这样就会读到图片并输出
python d:/Code/digitalOCR/img_cut_argparse.py -v "D:/Code/digitalOCR/scan1.jpg"
[[[255 255 255 ..., 255 255 255]]
ok
[ [255 255 255 ..., 255 255 255]]
ok
[ [255 255 255 ..., 255 255 255]]
ok
[ ..., ]
ok
[ [255 255 255 ..., 255 255 255]]
ok
[ [255 255 255 ..., 255 255 255]]
ok
[ [255 255 255 ..., 255 255 255]]]
ok
[D:/Code/digitalOCR/scan1.jpg]
ok