怎么用Java+OpenCV调用摄像头实现拍照功能


这篇文章主要介绍了怎么用Java+OpenCV调用摄像头实现拍照功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Java+OpenCV调用摄像头实现拍照功能文章都会有所收获,下面我们一起来看看吧。1.准备好一个USB外接摄像头,我这边使用的有两种,一种是普通的罗技摄像头,一种是双目摄像头(将来用来做活检);2.eclipse 2021-12版;3.JDK 11+,因为我们编写swing要使用到Window Builder窗体设计器这个插件。在eclipse 2021-12版里要驱动Windows Builder窗体设计器我们必须要用JDK11及+;4.使用Windows10环境编程。当然我们也可以使用Mac,但是Mac下如果是JAVA驱动摄像头有一个这样的梗:免费云主机域名那就是直接你在eclipse里无法直接调用摄像头,它会报一个“This app has crashed because it attempted to access privacy-sensitive data without a usage description”或者是OpenCV: not authorized to capture video (status 0), requesting…
OpenCV: can not spin main run loop from other thread, set OPENCV_AVFOUNDATION_SKIP_AUTH=1 to disable authorization request and perform it in your application.
OpenCV: camera failed to properly initialize这样的错误,这些错误都是因为Mac OS的权限问题导致,它意指你在Mac下没权限去调用Mac内置的一些设备。如果你用的是XCode写Swift那么你可以通过info.plist来解决此问题。但因为是eclipse里启动java main函数,目前在Mac OS下无法解决eclipse内运行驱动Mac外设这一类问题。如果你在Mac OS内,要运行OpenCV Java并驱动摄像头,你必须把项目打成可执行的jar包并且在command窗口下用java -jar 这样的命令去启动它。在启动时你的Mac OS会提示你给这个command窗口要授权,请点击【是】并且用指纹或者是密码授权,然后再次在command窗口运行java -jar opencv应用,你就可以在Mac OS下使用java去驱动摄像头了。因此这为我们的编码调试带来极大的不便,这就是为什么我们使用Windows10环境下开发opencv java的主要原因。我们的主界面是一个Java Swing的JFrame应用,它长成这个样子我们把屏幕分成上下两个区域,布局使用的是1024*768,带有点击关闭按钮即关闭程序的自由布局:上部区域我们使用一个JPanel来分组叫cameraGroup,这个JPanel也是自由布局然后在这个cameraGroup以左大右小,放置了两个额外的JPanel:videoCameravideoPreview其中的videoCamera是自定义的JPanel它是用来显示摄像头开启时不断的把摄像头内取到的图像“刷”到JPanel上显示用的,代码如下:下部区域下部区域我们放置了一个buttonGroup。这个buttonGroup用的是“网袋布局”,上面放置三个按钮。今天我们就要实现photoButton里的功能。说完了布局下面进入核心代码讲解。(最后会上全代码)JPanel这种组件一般是套在JFrame的contentPanel里的(这是用图形化设计器生成的JFrame自带的一个用来“盛”其它组件的容器)。contentPane大家可以认为是一种容器。它一般是这样的一层关系:JFrame(我们的主类)->contentPane->我们自己的上半部JPanel->videoCamera(JPanel)。在Java Swing里有一个方法叫repaint()方法,这个方法 一旦被调用,这个组件的“子组件”内的都会自动被依次调用一遍。因此,我们才自定义了一个JPanel叫VideoPanel,然后我们覆写了它里面的paintComponent方法这样,我们在我们的主类“FaceRecognize”里在通过摄像头得到了图像后把图像通过VideoPanel里的“setImageWithMat”方法set后,马上调用FaceRecognize自自的repaint方法,然后“父”事件一路向下传导,依次逐级把子组件进行“刷新”-子组件的paintComponent都会被触发一遍。摄像头得到图像显示在videoCamera区域的过程就是:不断通过FaceRecognize类里通过摄像头读到Mat对象;把Mat对象set到VideoPanel里;不断调用FaceRecognize里的repaint方法迫使VideoPanel里“刷新”出摄像头拍的内容;每显示一次,sleep(50毫秒);为了取得良好的刷新、连续不断的显示效果,你可以把上述方法套在一个“单线程”内。OpenCV是使用以下这个类来驱动摄像头的。然后打开摄像头,读入摄像头内容如下通过上述代码我们可以看到我上面描述的4步。capture.open(0)代表读取你的计算机当前连接的第1个摄像头,如果在mac上运行这一句一些mac都带有内嵌摄像头的,因此这一句代码就会驱动mac的默认内置摄像头;if(capture.isOpened()),必须要有,很多网上教程跳过了这一步检测,导致摄像头一直不出内容其实最后才知道是摄像头驱动有误或者坏了,而不是代码问题,最终耗费了太多的排错时间,其实结果是换一个摄像头就好了;while(true)后跟着capture.read(faceMat),这一句就是不断的读取摄像头的内容,并把摄像头的内容读到一个Mat对象中去;前面说了,为了让这个过程更“顺滑”、“丝滑”,我把这个过程套到了一个单线程里让它单独运行以不阻塞Java Swing的主界面。同时用“绿色”的方框把人脸在画面里“框”出来。为此我制作了一个函数如下:配合上我们的main方法就是这样用的:这一章节我们在OpenCV Java入门四 认出这是“一张脸”里其实已经讲过了,就是把一个Mat输出到一个jpg文件中。在本篇章节中,我们为了做得效果好一点会做这么几件事:等比例把摄像头拿到的Mat对象缩到“videoPreview”上;把摄像头当前的Mat输出到外部文件;把上述过程也套到了一个单线程里以不阻塞主类的显示界面;等比例缩放图片位于ImageUtils类,它得到一个Mat,然后转成java.awt.Image对象;再利用Image里的AffineTransformOp根据ratio(图像原比例)基于指定尺寸(宽:165, 高:200)的等比例缩放。再把Image转成BufferedImage;再把BufferedImage转回Mat给到FaceRecognize主类用来作VideoPanel的“显示”来显示到我们的preview区域,而preview区域其实也是用到了VideoPanel这个类来声明的;为此我们对photoButton进行事件编程TakePhotoProcess是一个单线程,代码如下:另外两个按钮“trainButton”和”identifyButton”我们留到后面2个篇章里去讲,我们一步一步来,这样大家才能夯实基础。最终这个FaceRecognize运行起来,然后点击photoButton后的效果如下图所示:

相关推荐: 怎么使用sm4js进行加密和国密sm4

本文小编为大家详细介绍“怎么使用sm4js进行加密和国密sm4”,内容详细,步骤清晰免费云主机域名,细节处理妥当,希望这篇“怎么使用sm4js进行加密和国密sm4”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在package.jso…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 07/27 18:15
Next 07/27 18:15

相关推荐