代码之家  ›  专栏  ›  技术社区  ›  OmniOwl

NotFoundException,即使条形码在图片中

  •  1
  • OmniOwl  · 技术社区  · 9 年前

    我正在尝试做一个简单的条形码扫描仪项目来取乐。我遇到了一个小问题。我正在使用zXing和网络摄像头捕获。

    即使图片中有条形码,Java也一直告诉我通过 NotFoundException 。每次运行webcamImageAcquisited时,我都会查找一帧(我假设是每帧?),然后在我捕获的帧中查找条形码。

    我用网络摄像头拍了这张照片(讽刺的是,使用了代码哈哈):

    barcode

    当我将鼠标悬停在这个条形码上时,它每秒报告大约30个图像,否则当它从我的屏幕上看我时(如果这意味着什么),它会报告大约7-8个图像。

    每当我找到代码时,我都想将其添加到 JList (尚未考虑重复项等)。

    我每次都调用这个代码 webcamImageObtained(WebcamEvent we) 火灾:

    @Override
        public void webcamImageObtained(WebcamEvent we) {
            BufferedImage myImage;
            try {
                myImage = webcam.getImage();
                LuminanceSource source = new BufferedImageLuminanceSource(myImage);
                BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
                Result result = reader.decode(bitmap);
                DefaultListModel dlm = (DefaultListModel) list.getModel();
                dlm.addElement(result.toString());
                list.setModel(dlm);
            } catch (NotFoundException ex) {
                Logger.getLogger(AdvancedWebcamPanelExample.class.getName()).log(Level.SEVERE, null, ex);
            } catch (ChecksumException ex) {
                Logger.getLogger(AdvancedWebcamPanelExample.class.getName()).log(Level.SEVERE, null, ex);
            } catch (FormatException ex) {
                Logger.getLogger(AdvancedWebcamPanelExample.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    

    这是整个班级:

    package sandbox_webcam;
    
    import com.github.sarxos.webcam.Webcam;
    import com.github.sarxos.webcam.WebcamDiscoveryEvent;
    import com.github.sarxos.webcam.WebcamDiscoveryListener;
    import com.github.sarxos.webcam.WebcamEvent;
    import com.github.sarxos.webcam.WebcamListener;
    import com.github.sarxos.webcam.WebcamPanel;
    import com.github.sarxos.webcam.WebcamPicker;
    import com.github.sarxos.webcam.WebcamResolution;
    import com.google.zxing.BinaryBitmap;
    import com.google.zxing.ChecksumException;
    import com.google.zxing.FormatException;
    import com.google.zxing.LuminanceSource;
    import com.google.zxing.NotFoundException;
    import com.google.zxing.Result;
    import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
    import com.google.zxing.common.HybridBinarizer;
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.lang.Thread.UncaughtExceptionHandler;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.imageio.ImageIO;
    import javax.swing.DefaultListModel;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JPanel;
    
    public class AdvancedWebcamPanelExample extends JFrame implements Runnable, WebcamListener, WindowListener, UncaughtExceptionHandler, ItemListener, WebcamDiscoveryListener {
    
        private Webcam webcam = null;
        private WebcamPanel panel = null;
        private WebcamPicker picker = null;
        private JButton button = null;
        private JList list = null;
        private ActionListener buttonListener = null;
        private com.google.zxing.Reader reader = new com.google.zxing.MultiFormatReader();
    
        @Override
        public void run() {
            Webcam.addDiscoveryListener(this);
    
            setTitle("Java Webcam Capture POC");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLayout(new BorderLayout());
    
            addWindowListener(this);
    
            picker = new WebcamPicker();
            picker.addItemListener(this);
    
            webcam = picker.getSelectedWebcam();
    
            if (webcam == null) {
                System.out.println("No webcams found...");
                System.exit(1);
            }
    
            webcam.setViewSize(WebcamResolution.VGA.getSize());
            webcam.addWebcamListener(AdvancedWebcamPanelExample.this);
    
            panel = new WebcamPanel(webcam, false);
            panel.setFPSDisplayed(true);
    
            buttonListener = new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (webcam != null) {
                        BufferedImage image = webcam.getImage();
                        JFileChooser filechooser = new JFileChooser();
    
                        int saveValue = filechooser.showDialog(button, "Save");
                        if (saveValue == JFileChooser.APPROVE_OPTION) {
                            try {
                                File f = filechooser.getSelectedFile();
                                ImageIO.write(image, "png", new File(f.getAbsolutePath() + ".png"));
                                System.out.println("Picture saved at: " + f.getAbsolutePath());
                            } catch (IOException ex) {
                                System.err.println("Failed to save the picture!");
                                ex.printStackTrace();
                            }
                        }
                    } else {
                        System.err.println("no webcam found to take a picture");
                    }
                }
            };
    
            button = new JButton("Snap a Picture!");
            button.addActionListener(buttonListener);
            list = new JList();
            list.setMinimumSize(new Dimension(200,this.getHeight()));
    
            add(picker, BorderLayout.NORTH);
            add(panel, BorderLayout.CENTER);
            add(button, BorderLayout.SOUTH);
            add(list, BorderLayout.EAST);
    
            pack();
            setVisible(true);
    
            Thread t = new Thread() {
                @Override
                public void run() {
                    panel.start();
                }
            };
    
            t.setName("example-starter");
            t.setDaemon(true);
            t.setUncaughtExceptionHandler(this);
            t.start();
        }
    
        @Override
        public void webcamOpen(WebcamEvent we) {
            System.out.println("webcam open");
        }
    
        @Override
        public void webcamClosed(WebcamEvent we) {
            System.out.println("webcam closed");
        }
    
        @Override
        public void webcamDisposed(WebcamEvent we) {
            System.out.println("webcam disposed");
        }
    
        @Override
        public void webcamImageObtained(WebcamEvent we) {
            BufferedImage myImage;
            try {
                myImage = webcam.getImage();
                LuminanceSource source = new BufferedImageLuminanceSource(myImage);
                BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
                Result result = reader.decode(bitmap);
                DefaultListModel dlm = (DefaultListModel) list.getModel();
                dlm.addElement(result.toString());
                list.setModel(dlm);
            } catch (NotFoundException ex) {
                Logger.getLogger(AdvancedWebcamPanelExample.class.getName()).log(Level.SEVERE, null, ex);
            } catch (ChecksumException ex) {
                Logger.getLogger(AdvancedWebcamPanelExample.class.getName()).log(Level.SEVERE, null, ex);
            } catch (FormatException ex) {
                Logger.getLogger(AdvancedWebcamPanelExample.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    
        @Override
        public void windowOpened(WindowEvent e) {
            // do nothing
        }
    
        @Override
        public void windowClosing(WindowEvent e) {
            // do nothing
        }
    
        @Override
        public void windowClosed(WindowEvent e) {
            webcam.close();
        }
    
        @Override
        public void windowIconified(WindowEvent e) {
            System.out.println("webcam viewer paused");
            panel.pause();
        }
    
        @Override
        public void windowDeiconified(WindowEvent e) {
            System.out.println("webcam viewer resumed");
            panel.resume();
        }
    
        @Override
        public void windowActivated(WindowEvent e) {
            // do nothing
        }
    
        @Override
        public void windowDeactivated(WindowEvent e) {
            // do nothing
        }
    
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            System.err.println(String.format("Exception in thread #s", t.getName()));
            e.printStackTrace();
        }
    
        @Override
        public void itemStateChanged(ItemEvent e) {
            if (e.getItem() != webcam) {
                if (webcam != null) {
                    panel.stop();
    
                    remove(panel);
                    webcam.removeWebcamListener(this);
                    webcam.close();
    
                    webcam = (Webcam) e.getItem();
                    webcam.setViewSize(WebcamResolution.VGA.getSize());
                    webcam.addWebcamListener(this);
    
                    System.out.println("selected " + webcam.getName());
    
                    panel = new WebcamPanel(webcam, false);
                    panel.setFPSDisplayed(true);
    
                    add(panel, BorderLayout.CENTER);
                    pack();
    
                    Thread t = new Thread() {
                        @Override
                        public void run() {
                            panel.start();
                        }
                    };
    
                    t.setName("example-stopper");
                    t.setDaemon(true);
                    t.setUncaughtExceptionHandler(this);
                    t.start();
                }
            }
        }
    
        @Override
        public void webcamFound(WebcamDiscoveryEvent event) {
            if (picker != null) {
                picker.addItem(event.getWebcam());
            }
        }
    
        @Override
        public void webcamGone(WebcamDiscoveryEvent event) {
            if (picker != null) {
                picker.removeItem(event.getWebcam());
            }
        }
    
    }
    

    我是不是错过了一些关于这个库如何扫描条形码的信息?

    编辑

    不确定这有多大帮助。。

    Mar 02, 2015 10:04:34 PM sandbox_webcam.AdvancedWebcamPanelExample webcamImageObtained
    SEVERE: null
    com.google.zxing.NotFoundException
    

    在此处引发异常:

    Result result = reader.decode(bitmap);
    
    1 回复  |  直到 9 年前
        1
  •  1
  •   Philipp Wendler    9 年前

    有一个不同的问题有一些可用的答案: Android zxing NotFoundException

    正如詹姆斯所说,如果条形码不起作用,在不同的环境和照明条件下,尝试在不同的媒体(纸张/屏幕)上使用条形码是一个好主意。特别要确保您有足够的光线,并且当相机指向条形码时,其FPS足够高。

    为了进行调试,还可以将 BinaryImage 并检查条形码在转换为黑白后是否实际可见。