最近突然想做一个人脸识别的程序,图像的获取可以从本地或者摄像头获取。
1、从本地获取比较简单,不多说。
2、从摄像头获取图片。网上查了一下,都是用的JMF(但是JMF已经很久没有更新,而且只支持32位的JDK,如果知道有更好的麻烦推荐一下!)
下载JMF(http://www.oracle.com/technetwork/java/javase/download-142937.html)
安装
安装完之后桌面上回出现JMStudio的快捷图标,
点开测试一下,file->capture;
摄像头驱动正常加载,点击OK,然后
我靠,这什么鬼?一片粉啊,一定要这么嫩吗 -_-||。 晃动一下窗口,会显示图像,但是是卡住的。
摄像头正常打开了,但是显示不了画面,这样完全没用啊!于是就去网上查了一下,没有答案,再看看回答时间,瞬间怀疑自己是不是用了个老古董了!
没办法,先试着写程序吧
1 public static Component loadDiver() 2 { 3 //String str1 = "vfw:logitech usb video camera:0"; 4 String str2 = "vfw:Microsoft WDM Image Capture (Win32):0"; 5 6 deviceInfo = CaptureDeviceManager.getDevice(str2); //加载设备驱动 7 mLocator = deviceInfo.getLocator(); 8 try 9 { 10 11 player = Manager.createRealizedPlayer(mLocator); //获取就绪的播放器 12 13 Component cp; 14 if((cp = player.getVisualComponent())!=null) 15 { 16 player.start(); 17 return cp; //返回窗体组件 18 } 19 } 20 catch(Exception e) 21 { 22 e.printStackTrace(); 23 } 24 return null; 25 }
运行之后发现一样出现粉屏的问题, 弄了一会儿发现好像在画面上覆盖了一层JLabel或者JTextArea就可以正常显示图像(感觉好low啊/捂脸),可能是打开的方式不对!
最后无意中发现,只要窗体对准电脑屏幕的最左边就可以正常显示了,这程序是不是有强迫症啊?_?
好吧,虽然莫名其妙,但是也勉强算是解决了显示问题了。
下面就是截图了,于是就用了笨办法,屏幕截图(求聪明的办法^_^):
1 BufferedImage buffImg = null; 2 try 3 { 4 buffImg = (new Robot()).createScreenCapture(new 5 Rectangle(0, 100, c1.getWidth(), c1.getHeight()-100)); //c1是上面方法返回的Component 6 } 7 catch(AWTException e1) 8 { 9 e1.printStackTrace(); 10 } 11 try 12 { 13 ImageIO.write(buffImg, "jpg", new File(path)); 14 } 15 catch(IOException e1) 16 { 17 e1.printStackTrace(); 18 }
成功获取图像
总结:JMF调用摄像头产生粉屏,把窗体放在屏幕最左侧可以正常显示,具体原因未知!个人猜测可能是系统不兼容的造成。