跟一个学习视频的老铁聊天,问我Java能不能做AI人工智能的东西?当然可以,很多大厂都提供了AI人工智能的免费或付费服务,可以通过三方接口调用来完成,这是最简单的方式了,当然如果你对AI确实感兴趣,建议可以从神经网络、图像与视觉、OpenCV,机器学习的实现技术,俗话说得好,兴趣是最好的老湿,威哥带一起搞一个简单的AI美颜程序出来,体验一下,AI的魅力所在。
为了让老铁们可以快速上手撸代码,威哥采用百度AI的API来实现这个案例,放心,so eazy!
先上效果图:
一、程序启动后先加载默认图片
二、直接按下【一键美妆】按钮,看看效果:
美女果然是换妆啦,我喜欢这种淡淡的粉红粉红色,你喜欢吗,不喜欢也没办法,这是直接调用百度AI换妆API自动换妆后返回的结果。
三、再看看【一键去泰国】功能是啥情况?哈哈
果然立马成了大妈,一口红牛差点没给吐出来,赶紧咽下去,差点浪费了一口,哈哈!
好了,程序演示完了,下面说一下如何实现的,小伙伴们准备好了吗,马上开干!
为了用界面展示程序,简单的用swing画了一个界面,大家会不会都无所谓,swing也不常用,就是自己玩玩而已。
首先打开百度AI的开发者平台,先看一下API咋用,地址如下:
https://cloud.baidu.com/apiexplorer/index.html?Product=GWSE-nmhroEsyriA&Api=GWAI-t2QcRmst8Vi
由于是网络操作,有延迟,所以把按钮的事件处理用一个线程调用来操作:
//虚拟换妆API调用
jButtonStart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("开始美妆");
new Thread(new Runnable() {
public void run() {
try {
startFace();
// faceBeauty();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}).start();
}
});
把操作的代码封装成一个方法:
String image = "https://sf3-ttcdn-tos.pstatp.com/obj/pgc-image/542152d72ee74a90997c162a1d5d73d0";
byte[] bytes = null;//response data
//换妆
private void startFace() throws IOException {
String path = "https://aip.baidubce.com/rest/2.0/face/v1/transfer";
ApiExplorerRequest request = new ApiExplorerRequest(HttpMethodName.POST, path);
// 设置header参数
request.addHeaderParameter("Content-Type", "application/json;charset=UTF-8");
// path = path+AuthService.getAuth();
// 设置query参数
request.addQueryParameter("access_token",AuthService.getAuth());
// 设置jsonBody参数
// ResourceBundle bundle = ResourceBundle.getBundle("res");
// String jsonBody = bundle.getString("url");
String jsonBody = "{\"source_image\":{\"image\":\""+image+"\",\"image_type\":\"URL\"},\"reference_images\":[{\"image\":\""+image+"\",\"image_type\":\"URL\"}]}";
// System.out.println("777777:"+jsonBody);
request.setJsonBody(jsonBody);
ApiExplorerClient client = new ApiExplorerClient();
try {
ApiExplorerResponse response = client.sendRequest(request);
// 返回结果格式为Json字符串
String result = response.getResult();
System.out.println("******************"+result);
JSONObject jsonObject = new JSONObject(result);
JSONObject resultObject = jsonObject.getJSONObject("result");
String transfer_image = resultObject.getString("transfer_image");
System.out.println(transfer_image);
bytes = Base64.decodeBase64(transfer_image);
if (bytes!=null) {
ImageIcon icon = new ImageIcon(bytes);
Image image1 = changeImage(IMAGE_WIDTH, IMAGE_HEIGHT, icon.getImage(), true);
icon = new ImageIcon(image1);
jLabel_iamge1.setIcon(icon);
}
} catch (Exception e) {
e.printStackTrace();
}
}
搞定,测试一下吧。
再来试试【一键去泰国】功能
按钮事件处理:
jButtonEditor.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Thread(new Runnable() {
public void run() {
faceEditattr();
}
}).start();
}
});
找到百度AI的示例代码,如下截图:
切换【示例代码】右边的【参数说明】选项:
威哥按照示例代码,封装的方法如下:
通过 jsonBody变量配置参数,action_type参数配置为 TO_FEMALE,老铁们也可以根据上图中的参数常量,测试其他选项,例如:
人脸编辑方式
- TO_KID: V1版本变小孩
- TO_OLD: V1版本变老人
- TO_FEMALE: V1版本变女生
- TO_MALE: V1版本变男生
- V2_AGE:V2版本年龄变换,选择该项后可通过target参数指定年龄
- V2_GENDER:v2版本性别变换,选择该项后需通过target进一步指定要转换的性别
public void faceEditattr(){
String path = "https://aip.baidubce.com/rest/2.0/face/v1/editattr";
ApiExplorerRequest request = new ApiExplorerRequest(HttpMethodName.POST, path);
// 设置header参数
request.addHeaderParameter("Content-Type", "application/json;charset=UTF-8");
// 设置query参数
request.addQueryParameter("access_token",AuthService.getAuth());
// 设置jsonBody参数
String jsonBody = "{\"image\":\""+image+"\",\"image_type\":\"URL\",\"action_type\":\"TO_FEMALE\",\"quality_control\":\"HIGH\"}";
request.setJsonBody(jsonBody);
ApiExplorerClient client = new ApiExplorerClient();
try {
ApiExplorerResponse response = client.sendRequest(request);
String result = response.getResult();
// 返回结果格式为Json字符串
System.out.println("faceEditattr="+result);
JSONObject jsonObject = new JSONObject(result);
JSONObject resultObject = jsonObject.getJSONObject("result");
String transfer_image = resultObject.getString("image");
System.out.println(transfer_image);
bytes = Base64.decodeBase64(transfer_image);
if (bytes!=null) {
ImageIcon icon = new ImageIcon(bytes);
Image image1 = changeImage(IMAGE_WIDTH, IMAGE_HEIGHT, icon.getImage(), true);
icon = new ImageIcon(image1);
jLabel_iamge1.setIcon(icon);
}
} catch (Exception e) {
e.printStackTrace();
}
}
OK,测试一下,完美展示文章开头的效果,好了,感兴趣的朋友可以自己操作一下!