package com.iailab.netsdk.demo.frame.TargetRecognition; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Vector; import java.util.concurrent.ExecutionException; import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import com.sun.jna.Memory; import com.sun.jna.Pointer; import com.iailab.netsdk.common.DateChooserJButtonEx; import com.iailab.netsdk.common.PaintPanel; import com.iailab.netsdk.common.Res; import com.iailab.netsdk.demo.module.LoginModule; import com.iailab.netsdk.demo.module.SearchByPictureModule; import com.iailab.netsdk.lib.NetSDKLib; import com.iailab.netsdk.lib.ToolKits; import com.iailab.netsdk.lib.NetSDKLib.*; public class SearchByPicDialog extends JDialog { /** * */ private static final long serialVersionUID = 1L; private Vector chnList = new Vector(); private Memory memory = null; private static volatile int nProgress = 0; // 设备处理进度 private static volatile int nCount = 0; public SearchByPicDialog() { setTitle(Res.string().getSearchByPic()); setLayout(new BorderLayout()); setModal(true); pack(); setSize(780, 550); setResizable(false); setLocationRelativeTo(null); setDefaultCloseOperation(DISPOSE_ON_CLOSE); // 释放窗体 JPanel panel = new JPanel(); progressBar = new JProgressBar(0, 100); Dimension dimension = new Dimension(); dimension.height = 18; progressBar.setPreferredSize(dimension); progressBar.setStringPainted(true); add(panel, BorderLayout.CENTER); add(progressBar, BorderLayout.SOUTH); //////// panel.setLayout(new BorderLayout()); SearchPicConditionPanel searchPicConditionPanel = new SearchPicConditionPanel(); searchPicInfoTextArea = new JTextArea(); Dimension dimension1 = new Dimension(); dimension1.width = 220; searchPicConditionPanel.setPreferredSize(dimension1); panel.add(searchPicConditionPanel, BorderLayout.WEST); panel.add(new JScrollPane(searchPicInfoTextArea), BorderLayout.CENTER); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); } }); } private class SearchPicConditionPanel extends JPanel { /** * */ private static final long serialVersionUID = 1L; public SearchPicConditionPanel() { setLayout(new BorderLayout()); JPanel panelNorth = new JPanel(); JPanel panelSouth = new JPanel(); add(panelNorth, BorderLayout.NORTH); add(panelSouth, BorderLayout.SOUTH); //////// searchPicPanel = new PaintPanel(); JButton selectPicBtn = new JButton(Res.string().getSelectPicture()); JButton downloadBtn = new JButton(Res.string().getDownloadQueryPicture()); searchPicPanel.setPreferredSize(new Dimension(210, 270)); selectPicBtn.setPreferredSize(new Dimension(210, 20)); downloadBtn.setPreferredSize(new Dimension(210, 20)); panelNorth.setLayout(new FlowLayout()); panelNorth.setPreferredSize(new Dimension(210, 330)); panelNorth.add(searchPicPanel); panelNorth.add(selectPicBtn); panelNorth.add(downloadBtn); ///// faceCheckBox = new JCheckBox(Res.string().getFaceLibrary()); historyCheckBox = new JCheckBox(Res.string().getHistoryLibrary()); faceCheckBox.setPreferredSize(new Dimension(100, 20)); historyCheckBox.setPreferredSize(new Dimension(100, 20)); startTimeLabel = new JLabel(Res.string().getStartTime(), JLabel.CENTER); endTimeLabel = new JLabel(Res.string().getEndTime(), JLabel.CENTER); chnLabel = new JLabel(Res.string().getChannel(), JLabel.CENTER); JLabel similaryLabel = new JLabel(Res.string().getSimilarity(), JLabel.CENTER); Dimension dimension1 = new Dimension(); dimension1.width = 80; dimension1.height = 20; startTimeLabel.setPreferredSize(dimension1); endTimeLabel.setPreferredSize(dimension1); chnLabel.setPreferredSize(dimension1); similaryLabel.setPreferredSize(dimension1); startTimeBtn = new DateChooserJButtonEx("2018-11-07"); endTimeBtn = new DateChooserJButtonEx(); chnComboBox = new JComboBox(); for(int i = 1; i < LoginModule.m_stDeviceInfo.byChanNum + 1; i++) { chnList.add(Res.string().getChannel() + " " + String.valueOf(i)); } // 登陆成功,将通道添加到控件 chnComboBox.setModel(new DefaultComboBoxModel(chnList)); similaryTextField = new JTextField("60", JTextField.CENTER); Dimension dimension2 = new Dimension(); dimension2.width = 120; dimension2.height = 20; startTimeBtn.setPreferredSize(dimension2); endTimeBtn.setPreferredSize(dimension2); chnComboBox.setPreferredSize(dimension2); similaryTextField.setPreferredSize(dimension2); searchPicBtn = new JButton(Res.string().getSearch()); searchPicBtn.setPreferredSize(new Dimension(210, 20)); panelSouth.setLayout(new FlowLayout()); panelSouth.setPreferredSize(new Dimension(210, 160)); panelSouth.add(faceCheckBox); panelSouth.add(historyCheckBox); panelSouth.add(startTimeLabel); panelSouth.add(startTimeBtn); panelSouth.add(endTimeLabel); panelSouth.add(endTimeBtn); panelSouth.add(chnLabel); panelSouth.add(chnComboBox); panelSouth.add(similaryLabel); panelSouth.add(similaryTextField); panelSouth.add(searchPicBtn); historyCheckBox.setSelected(true); faceCheckBox.setSelected(false); // 选择图片,获取图片的信息 selectPicBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { String picPath = ""; // 选择图片,获取图片路径,并在界面显示 picPath = ToolKits.openPictureFile(searchPicPanel); if(!picPath.equals("")) { try { memory = ToolKits.readPictureFile(picPath); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }); downloadBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { DownloadPictureDialog dialog = new DownloadPictureDialog(); dialog.setVisible(true); } }); searchPicBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { searchPicBtn.setEnabled(false); progressBar.setValue(0); searchPicInfoTextArea.setText(""); } }); searchByPicture(); } }); faceCheckBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { if(faceCheckBox.isSelected()) { historyCheckBox.setSelected(false); chnLabel.setVisible(false); chnComboBox.setVisible(false); startTimeLabel.setVisible(false); endTimeLabel.setVisible(false); startTimeBtn.setVisible(false); endTimeBtn.setVisible(false); } else { historyCheckBox.setSelected(true); chnLabel.setVisible(true); chnComboBox.setVisible(true); startTimeLabel.setVisible(true); endTimeLabel.setVisible(true); startTimeBtn.setVisible(true); endTimeBtn.setVisible(true); } } }); historyCheckBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { if(historyCheckBox.isSelected()) { faceCheckBox.setSelected(false); chnLabel.setVisible(true); chnComboBox.setVisible(true); startTimeLabel.setVisible(true); endTimeLabel.setVisible(true); startTimeBtn.setVisible(true); endTimeBtn.setVisible(true); } else { faceCheckBox.setSelected(true); chnLabel.setVisible(false); chnComboBox.setVisible(false); startTimeLabel.setVisible(false); endTimeLabel.setVisible(false); startTimeBtn.setVisible(false); endTimeBtn.setVisible(false); } } }); } } private void searchByPicture() { new SwingWorker() { int nTotalCount = 0; // 查询到的总个数 @Override protected Boolean doInBackground() { int beginNum = 0; // 偏移量 int nCount = 0; // 循环查询了几次 int index = 0; // index + 1 为查询到的总个数 int nFindCount = 10; // 每次查询的个数 StringBuffer message = null; if(memory == null) { JOptionPane.showMessageDialog(null, Res.string().getChooseFacePic(), Res.string().getErrorMessage(), JOptionPane.ERROR_MESSAGE); return false; } // 获取查询句柄 nTotalCount = SearchByPictureModule.startFindPerson(memory, startTimeBtn.getText(), endTimeBtn.getText(), historyCheckBox.isSelected(), chnComboBox.getSelectedIndex(), similaryTextField.getText()); if(nTotalCount == 0) { // 查询失败 // 查询失败,关闭查询 SearchByPictureModule.doFindClosePerson(); return false; } else if(nTotalCount == -1) { // 设备正在处理,通过订阅来查询处理进度 nProgress = 0; nCount = 0; SearchByPictureModule.attachFaceFindState(fFaceFindStateCb.getInstance()); } else { while(true) { CANDIDATE_INFOEX[] caInfoexs = SearchByPictureModule.doFindNextPerson(beginNum, nFindCount); if(caInfoexs == null) { break; } for(int i = 0; i < caInfoexs.length; i++) { index = i + nFindCount * nCount + 1; // 清空 message = new StringBuffer(); if(historyCheckBox.isSelected()) { // 历史库显示 message.append("[" + index + "]"+Res.string().getTime()+":" + caInfoexs[i].stTime.toStringTimeEx() + "\n"); message.append("[" + index + "]"+Res.string().getUid()+":" + new String(caInfoexs[i].stPersonInfo.szUID).trim() + "\n"); message.append("[" + index + "]"+Res.string().getSex()+":" + Res.string().getSex(caInfoexs[i].stPersonInfo.bySex) + "\n"); message.append("[" + index + "]"+Res.string().getAge()+":" + caInfoexs[i].stPersonInfo.byAge + "\n"); message.append("[" + index + "]"+Res.string().getColor()+":" + Res.string().getColor(0) + "\n"); message.append("[" + index + "]"+Res.string().getEye()+":" + Res.string().getEyeState(caInfoexs[i].stPersonInfo.emEye) + "\n"); message.append("[" + index + "]"+Res.string().getMouth()+":" + Res.string().getMouthState(caInfoexs[i].stPersonInfo.emMouth) + "\n"); message.append("[" + index + "]"+Res.string().getMask()+":" + Res.string().getMaskState(caInfoexs[i].stPersonInfo.emMask) + "\n"); message.append("[" + index + "]"+Res.string().getBeard()+":" + Res.string().getBeardState(caInfoexs[i].stPersonInfo.emBeard) + "\n"); message.append("[" + index + "]"+Res.string().getGlasses()+":" + Res.string().getGlasses(caInfoexs[i].stPersonInfo.byGlasses) + "\n"); message.append("[" + index + "]"+Res.string().getSimilarity()+":" + caInfoexs[i].bySimilarity + "\n"); message.append("[" + index + "]"+Res.string().getPicturePath()+":" + caInfoexs[i].stPersonInfo.szFacePicInfo[0].pszFilePath.getString(0) + "\n"); } else { // 人脸库显示 message.append("[" + index + "]"+Res.string().getFaceLibraryID()+":" + new String(caInfoexs[i].stPersonInfo.szGroupID).trim() + "\n"); try { message.append("[" + index + "]"+Res.string().getFaceLibraryName()+":" + new String(caInfoexs[i].stPersonInfo.szGroupName, "GBK").trim() + "\n"); message.append("[" + index + "]"+Res.string().getName()+":" + new String(caInfoexs[i].stPersonInfo.szPersonName, "GBK").trim() + "\n"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } message.append("[" + index + "]"+Res.string().getUid()+":" + new String(caInfoexs[i].stPersonInfo.szUID).trim() + "\n"); message.append("[" + index + "]"+Res.string().getBirthday()+":" + (caInfoexs[i].stPersonInfo.wYear) + "-" + (0xff & caInfoexs[i].stPersonInfo.byMonth) + "-" + (0xff & caInfoexs[i].stPersonInfo.byDay) + "\n"); message.append("[" + index + "]"+Res.string().getSex()+":" + Res.string().getSex(caInfoexs[i].stPersonInfo.bySex) + "\n"); message.append("[" + index + "]"+Res.string().getCardType()+":" + Res.string().getIdType(caInfoexs[i].stPersonInfo.byIDType) + "\n"); message.append("[" + index + "]"+Res.string().getCardNum()+":" + new String(caInfoexs[i].stPersonInfo.szID).trim() + "\n"); message.append("[" + index + "]"+Res.string().getSimilarity()+":" + caInfoexs[i].bySimilarity + "\n"); message.append("[" + index + "]"+Res.string().getPicturePath()+":" + caInfoexs[i].stPersonInfo.szFacePicInfo[0].pszFilePath.getString(0) + "\n"); } message.append("\n"); publish(message); } if(caInfoexs.length < nFindCount) { System.out.printf("No More Record, Find End!\n"); break; } else { beginNum += nFindCount; nCount++; } } // 关闭查询 SearchByPictureModule.doFindClosePerson(); } return true; } @Override protected void process(java.util.List chunks) { for(StringBuffer data : chunks) { searchPicInfoTextArea.append(data.toString()); searchPicInfoTextArea.updateUI(); } super.process(chunks); } @Override protected void done() { if(nTotalCount == 0) { // 查询总个数失败 searchPicBtn.setEnabled(true); progressBar.setValue(100); searchPicInfoTextArea.append("未查询到相关信息... \n"); searchPicInfoTextArea.updateUI(); } else if(nTotalCount == -1){ // 设备在处理中 searchPicInfoTextArea.append(Res.string().getLoading()+"... \n"); searchPicInfoTextArea.updateUI(); } else { try { if(get()) { // 其他情况,查询信息结束 searchPicBtn.setEnabled(true); progressBar.setValue(100); searchPicInfoTextArea.append("查询结束... \n"); searchPicInfoTextArea.updateUI(); } } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } } }.execute(); } /** * 订阅人脸回调函数 */ private static class fFaceFindStateCb implements NetSDKLib.fFaceFindState { private fFaceFindStateCb() {} private static class fFaceFindStateCbHolder { private static final fFaceFindStateCb instance = new fFaceFindStateCb(); } public static fFaceFindStateCb getInstance() { return fFaceFindStateCbHolder.instance; } @Override public void invoke(LLong lLoginID, LLong lAttachHandle, Pointer pstStates, int nStateNum, Pointer dwUser) { if(nStateNum < 1) { return; } NET_CB_FACE_FIND_STATE[] msg = new NET_CB_FACE_FIND_STATE[nStateNum]; for(int i = 0; i < nStateNum; i++) { msg[i] = new NET_CB_FACE_FIND_STATE(); } ToolKits.GetPointerDataToStructArr(pstStates, msg); for(int i = 0; i < nStateNum; i++) { if(SearchByPictureModule.nToken == msg[i].nToken) { nProgress = msg[i].nProgress; nCount = msg[i].nCurrentCount; // 返回的总个数 // 刷新设备处理进度 // UI线程 EventQueue.invokeLater(new Runnable() { @Override public void run() { progressBar.setValue(nProgress); if(nProgress == 100) { // 进度等于100,设备处理完毕,开始查询 // 异步线程处理 new SearchPictureWoker(nCount).execute(); } } }); } } } } /** * 用于订阅人脸状态后的查询 * 以图搜图与查询人员信息的接口是一样的,只是逻辑不一样,doFindNextPerson接口时,都是指定每次查询的个数,最大20,然后根据偏移量循环查询 * SwingWorker为异步线程,回调属于子线程,不能做耗时操作和刷新UI */ private static class SearchPictureWoker extends SwingWorker { private int nTotalCount; // 查询到的总个数 public SearchPictureWoker(int nTotalCount) { this.nTotalCount = nTotalCount; } @Override protected Boolean doInBackground() { int beginNum = 0; // 偏移量 int nCount = 0; // 循环查询了几次 int index = 0; // index + 1 为查询到的总个数 int nFindCount = 10; // 每次查询的个数 StringBuffer message = null; // 进度达到100%,关闭订阅 SearchByPictureModule.detachFaceFindState(); System.out.println("nTotalCount = " + nTotalCount); if(nTotalCount == 0) { // 关闭查询 SearchByPictureModule.doFindClosePerson(); return false; } while(true) { CANDIDATE_INFOEX[] caInfoexs = SearchByPictureModule.doFindNextPerson(beginNum, nFindCount); if(caInfoexs == null) { break; } for(int i = 0; i < caInfoexs.length; i++) { index = i + nFindCount * nCount + 1; // 清空 message = new StringBuffer(); if(historyCheckBox.isSelected()) { // 历史库显示 message.append("[" + index + "]"+Res.string().getTime()+":" + caInfoexs[i].stTime.toStringTimeEx() + "\n"); message.append("[" + index + "]"+Res.string().getUid()+":" + new String(caInfoexs[i].stPersonInfo.szUID).trim() + "\n"); message.append("[" + index + "]"+Res.string().getSex()+":" + Res.string().getSex(caInfoexs[i].stPersonInfo.bySex) + "\n"); message.append("[" + index + "]"+Res.string().getAge()+":" + caInfoexs[i].stPersonInfo.byAge + "\n"); message.append("[" + index + "]"+Res.string().getColor()+":" + Res.string().getColor(0) + "\n"); message.append("[" + index + "]"+Res.string().getEye()+":" + Res.string().getEyeState(caInfoexs[i].stPersonInfo.emEye) + "\n"); message.append("[" + index + "]"+Res.string().getMouth()+":" + Res.string().getMouthState(caInfoexs[i].stPersonInfo.emMouth) + "\n"); message.append("[" + index + "]"+Res.string().getMask()+":" + Res.string().getMaskState(caInfoexs[i].stPersonInfo.emMask) + "\n"); message.append("[" + index + "]"+Res.string().getBeard()+":" + Res.string().getBeardState(caInfoexs[i].stPersonInfo.emBeard) + "\n"); message.append("[" + index + "]"+Res.string().getGlasses()+":" + Res.string().getGlasses(caInfoexs[i].stPersonInfo.byGlasses) + "\n"); message.append("[" + index + "]"+Res.string().getSimilarity()+":" + caInfoexs[i].bySimilarity + "\n"); message.append("[" + index + "]"+Res.string().getPicturePath()+":" + caInfoexs[i].stPersonInfo.szFacePicInfo[0].pszFilePath.getString(0) + "\n"); } else { // 人脸库显示 message.append("[" + index + "]"+Res.string().getFaceLibraryID()+":" + new String(caInfoexs[i].stPersonInfo.szGroupID).trim() + "\n"); try { message.append("[" + index + "]"+Res.string().getFaceLibraryName()+":" + new String(caInfoexs[i].stPersonInfo.szGroupName, "GBK").trim() + "\n"); message.append("[" + index + "]"+Res.string().getName()+":" + new String(caInfoexs[i].stPersonInfo.szPersonName, "GBK").trim() + "\n"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } message.append("[" + index + "]"+Res.string().getUid()+":" + new String(caInfoexs[i].stPersonInfo.szUID).trim() + "\n"); message.append("[" + index + "]"+Res.string().getBirthday()+":" + (caInfoexs[i].stPersonInfo.wYear) + "-" + (0xff & caInfoexs[i].stPersonInfo.byMonth) + "-" + (0xff & caInfoexs[i].stPersonInfo.byDay) + "\n"); message.append("[" + index + "]"+Res.string().getSex()+":" + Res.string().getSex(caInfoexs[i].stPersonInfo.bySex) + "\n"); message.append("[" + index + "]"+Res.string().getCardType()+":" + Res.string().getIdType(caInfoexs[i].stPersonInfo.byIDType) + "\n"); message.append("[" + index + "]"+Res.string().getCardNum()+":" + new String(caInfoexs[i].stPersonInfo.szID).trim() + "\n"); message.append("[" + index + "]"+Res.string().getSimilarity()+":" + caInfoexs[i].bySimilarity + "\n"); message.append("[" + index + "]"+Res.string().getPicturePath()+":" + caInfoexs[i].stPersonInfo.szFacePicInfo[0].pszFilePath.getString(0) + "\n"); } message.append("\n"); publish(message); } if(caInfoexs.length < nFindCount) { System.out.printf("No More Record, Find End!\n"); break; } else { beginNum += nFindCount; nCount++; } } // 关闭查询 SearchByPictureModule.doFindClosePerson(); return true; } @Override protected void process(java.util.List chunks) { for(StringBuffer data : chunks) { searchPicInfoTextArea.append(data.toString()); searchPicInfoTextArea.updateUI(); } super.process(chunks); } @Override protected void done() { searchPicBtn.setEnabled(true); searchPicInfoTextArea.append(Res.string().getEndSearch()+"... \n"); searchPicInfoTextArea.updateUI(); } } private static JTextArea searchPicInfoTextArea; private static JProgressBar progressBar; private static JButton searchPicBtn; private PaintPanel searchPicPanel; private JComboBox chnComboBox; private JTextField similaryTextField; private DateChooserJButtonEx startTimeBtn; private DateChooserJButtonEx endTimeBtn; private JLabel chnLabel; private JLabel startTimeLabel; private JLabel endTimeLabel; private JCheckBox faceCheckBox; private static JCheckBox historyCheckBox; }