一.功能界面展示:
二.代码展示:
以下是Swing窗体,按钮设置。
/**摄像头面板*/
static OpenCVFrameConverter.ToIplImage converter = new
OpenCVFrameConverter.ToIplImage();
private CanvasFrame canvas = new CanvasFrame("摄像头");//新建一个窗口
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
private JLabel canvasPanel = new JLabel(); // 照片显示
private JPanel cameraPanel = new JPanel(); // 摄像头JPanel
/**开启摄像头按钮*/
private JButton startButton = new JButton("开 启");
/**拍摄摄像头按钮*/
private JButton cameraButton = new JButton("拍 摄");
/**关闭摄像头按钮*/
private JButton stopButton = new JButton("关 闭");
/**摄像头面板*/
cameraPanel.setBackground(new Color(231, 230, 230));
cameraPanel.setBounds(getProportionWidth(630), getProportionHeight(15), getProportionWidth(260),
getProportionHeight(280));
cameraPanel.setLayout(null);
JPanel8.add(cameraPanel);
//照片显示面板
canvasPanel.setBounds(getProportionWidth(70), getProportionHeight(15), getProportionWidth(230),
getProportionHeight(195));
canvasPanel.setBackground(new Color(231, 230, 230));
canvasPanel.setLayout(null);
canvasPanel.setBorder(null);
cameraPanel.add(canvasPanel);
//默认显示无照片
ImageIcon noimage = new ImageIcon(ClassLoader.getSystemResource("img/noimages.png"));
canvasPanel.setIcon(noimage);
1.开启按钮代码:
功能:打开摄像头窗体,每过50秒获取一次图像。
/**开始按钮*/
startButton.setBackground(Color.white);
startButton.setBounds(getProportionWidth(70), getProportionHeight(200), getProportionWidth(50),
getProportionHeight(20));
startButton.setFont(new Font("华文新魏",Font.PLAIN,15));
cameraPanel.add(startButton);
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Thread(new Runnable() {
@Override
public void run() {
flag = true;
while (flag){
try {
grabber.start(); //开始获取摄像头数据
canvas.show();//显示窗体
// canvas.setAlwaysOnTop(true); //页面一直在最上面
canvas.setPreferredSize(new Dimension(600, 500));//设置窗体大小
canvas.setLocation(0, 0);//设置窗体位置
canvas.showImage(grabber.grab());//获取摄像头图像并放到窗口上显示, 这里的Frame frame=grabber.grab(); frame是一帧视频图像
canvas.setResizable(false);// 静止放大缩小
try {
Thread.sleep(50);//50毫秒刷新一次图像
} catch (InterruptedException e1) {
e1.printStackTrace();
}
} catch (FrameGrabber.Exception e1) {
e1.printStackTrace();
}
}
}
}).start();
}
});
2.拍照按钮代码
功能说明:
1.将图片保存到本地:在D盘新增一个文件夹,将截取的图片放入;
2.图片处理:读取本地文件夹的文件,进行缩放处理后,保存到数据库;
3.展示图片:读取数据库的图片展现到界面上
4.删除本地文件夹
5.关闭页面,停止抓取
/**拍摄按钮*/
cameraButton.setBackground(Color.white);
cameraButton.setBounds(getProportionWidth(130), getProportionHeight(200), getProportionWidth(50),
getProportionHeight(20));
cameraButton.setFont(new Font("华文新魏",Font.PLAIN,15));
cameraPanel.add(cameraButton);
cameraButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
opencv_core.Mat mat = converter.convertToMat(grabber.grabFrame());
//在D盘新建一个文件夹
File file = new File("D:\\img");
file.mkdirs();
String filePath ="d:\\img\\"+ hyhMyJTF.getText().trim() + ".jpg";//图片路径
//将拍照的图片放入文件夹中,并用会员号做文件名
opencv_imgcodecs.imwrite(filePath, mat);
/**读取本地图片*/
// FileInputStream in;
// in = ImageUtil.readImage(filePath);
BufferedImage result = null;
BufferedImage im = ImageIO.read(new File(filePath));
/** 原始图像的宽度和高度 */
int width = im.getWidth();
int height = im.getHeight();
//压缩计算
/**这个参数是要转化成的倍数,如果是1就是转化成1倍*/
float resizeTimes = 0.5f;
/** 调整后的图片的宽度和高度 */
int toWidth = (int) (width * resizeTimes);
int toHeight = (int) (height * resizeTimes);
/** 新生成结果图片 */
result = new BufferedImage(toWidth, toHeight,
BufferedImage.TYPE_INT_RGB);
result.getGraphics().drawImage(
im.getScaledInstance(toWidth, toHeight,
java.awt.Image.SCALE_SMOOTH), 0, 0, null);
/**将图片转成InputStream存入到数据库*/
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(result, "jpg", os);
InputStream imageInput = new ByteArrayInputStream(os.toByteArray());
//保存到数据库中
VcvoyageBoardingRecodeDAO vcvoyageBoardingRecodeDAO = new VcvoyageBoardingRecodeDAO();
vcvoyageBoardingRecodeDAO.insertPicture(hyhMyJTF.getText().trim(),imageInput);
//删除本地文件
if (file.exists()) {//判断文件是否存在
if (file.isFile()) {//判断是否是文件
file.delete();//删除文件
} else if (file.isDirectory()) {//否则如果它是一个目录
File[] files = file.listFiles();//声明目录下所有的文件 files[];
for (int i = 0;i < files.length;i ++) {//遍历目录下所有的文件
files[i].delete();//把每个文件用这个方法进行迭代
}
file.delete();//删除文件夹
}
} else {
System.out.println("所删除的文件不存在");
}
//查询图片
V_membership v_membership = vcvoyageBoardingRecodeDAO.findPicture(hyhMyJTF.getText().trim());
Blob picture = v_membership.getM_picture();//获取图片
//Blob类型转image,并显示到系统中
InputStream is = picture.getBinaryStream(); //转换成输入流
BufferedImage img = ImageIO.read(is);
Image images;
images = img.getScaledInstance(300, 240, Image.SCALE_DEFAULT);
canvasPanel.setIcon(new ImageIcon(images));
new Thread(()->{
try {
Thread.sleep(1000);
flag = false;
canvas.dispose();
grabber.stop();//停止抓取
} catch (Exception e1) {
e1.printStackTrace();
}
}).start();
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
3.关闭按钮代码
功能说明:关闭窗体,关闭抓取
/**关闭按钮*/
stopButton.setBackground(Color.white);
stopButton.setBounds(getProportionWidth(190), getProportionHeight(200), getProportionWidth(50),
getProportionHeight(20));
stopButton.setFont(new Font("华文新魏",Font.PLAIN,15));
cameraPanel.add(stopButton);
stopButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
flag = false;
canvas.dispose();
grabber.stop();//停止抓取
} catch (FrameGrabber.Exception e1) {
e1.printStackTrace();
}
}
});