Java 当我试图从我的网络摄像头中捕获图像时,它会拍摄一张全黑的图像
我下载了一个与我的网络摄像头交互的。我正在尝试添加通过网络摄像头拍照的功能,或者只是捕获当前图像并将其保存在我的C:目录中 我创建了一个名为Capture(startC)的按钮,并创建了一个ActionListener ActionListenerJava 当我试图从我的网络摄像头中捕获图像时,它会拍摄一张全黑的图像,java,Java,我下载了一个与我的网络摄像头交互的。我正在尝试添加通过网络摄像头拍照的功能,或者只是捕获当前图像并将其保存在我的C:目录中 我创建了一个名为Capture(startC)的按钮,并创建了一个ActionListener ActionListener startC.addActionListener(new ActionListener() { @Override public void actionPerfor
startC.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
// Grab a frame
FrameGrabbingControl fgc = new FrameGrabbingControl() {
@Override
public Component getControlComponent() {
// TODO Auto-generated method stub
return null;
}
@Override
public Buffer grabFrame() {
// return null;
return new Buffer();
}
};
player.getControl("javax.media.control.FrameGrabbingControl");
buf = fgc.grabFrame();
// Convert it to an image
BufferToImage btoi = new BufferToImage((VideoFormat)buf.getFormat());
// btoi = new BufferToImage((VideoFormat)buf.getFormat());
img = btoi.createImage(buf);
// show the image
//imgpanel.setImage(img);
// save image
try {
saveJPG(img,"c:\\test.jpg");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
startC.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Vector devices = CaptureDeviceManager.getDeviceList(null);
CaptureDeviceInfo cdi = null;
for (Iterator i = devices.iterator(); i.hasNext();) {
cdi = (CaptureDeviceInfo) i.next();
/*
* Get the first Video For Windows (VFW) capture device. Use
* the JMF registry tool in the bin directory of the JMF
* distribution to detect available capture devices on your
* computer.
*/
if (cdi.getName().startsWith("vfw:"))
break;
}
try {
player = Manager.createRealizedPlayer(cdi.getLocator());
player.start();
} catch (NoPlayerException e2) {
e2.printStackTrace();
} catch (CannotRealizeException e3) {
e3.printStackTrace();
} catch (IOException e4) {
e4.printStackTrace();
}
// start the Timer with 3s intervals
new Timer(3000, this).start();
// Grab a frame from the capture device
FrameGrabbingControl fgc = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
buf = fgc.grabFrame();
BufferToImage btoi = new BufferToImage((VideoFormat) buf
.getFormat());
img = btoi.createImage(buf);
});
更新的ActionListener
startC.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
// Grab a frame
FrameGrabbingControl fgc = new FrameGrabbingControl() {
@Override
public Component getControlComponent() {
// TODO Auto-generated method stub
return null;
}
@Override
public Buffer grabFrame() {
// return null;
return new Buffer();
}
};
player.getControl("javax.media.control.FrameGrabbingControl");
buf = fgc.grabFrame();
// Convert it to an image
BufferToImage btoi = new BufferToImage((VideoFormat)buf.getFormat());
// btoi = new BufferToImage((VideoFormat)buf.getFormat());
img = btoi.createImage(buf);
// show the image
//imgpanel.setImage(img);
// save image
try {
saveJPG(img,"c:\\test.jpg");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
startC.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Vector devices = CaptureDeviceManager.getDeviceList(null);
CaptureDeviceInfo cdi = null;
for (Iterator i = devices.iterator(); i.hasNext();) {
cdi = (CaptureDeviceInfo) i.next();
/*
* Get the first Video For Windows (VFW) capture device. Use
* the JMF registry tool in the bin directory of the JMF
* distribution to detect available capture devices on your
* computer.
*/
if (cdi.getName().startsWith("vfw:"))
break;
}
try {
player = Manager.createRealizedPlayer(cdi.getLocator());
player.start();
} catch (NoPlayerException e2) {
e2.printStackTrace();
} catch (CannotRealizeException e3) {
e3.printStackTrace();
} catch (IOException e4) {
e4.printStackTrace();
}
// start the Timer with 3s intervals
new Timer(3000, this).start();
// Grab a frame from the capture device
FrameGrabbingControl fgc = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
buf = fgc.grabFrame();
BufferToImage btoi = new BufferToImage((VideoFormat) buf
.getFormat());
img = btoi.createImage(buf);
});
SaveJPG方法
public static void saveJPG(Image img, String s) throws IOException
{
BufferedImage bi = new BufferedImage(640, 480, BufferedImage.TYPE_INT_RGB);
File outputfile = new File("C:\\saved.jpg");
ImageIO.write(bi, "png", outputfile);
}
问题是,当我单击“捕获”时,它只是保存了一个全黑的屏幕,而这不是网络摄像头的焦点所在
有人能帮忙吗
@更新
第520行=buf=fgc.grabFrame()代码>
已经有一段时间了,但请尝试:
public static void saveJPG(Image img, String s) throws IOException {
File outputfile = new File("C:\\saved.jpg");
ImageIO.write(img, "jpg", outputfile);
}
已经有一段时间了,但请尝试:
public static void saveJPG(Image img, String s) throws IOException {
File outputfile = new File("C:\\saved.jpg");
ImageIO.write(img, "jpg", outputfile);
}
通过搜索和谷歌搜索,我找到了解决问题的方法
解决方案
startC.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
OpenCVWebCam webCam = (OpenCVWebCam) cam;
try {
webCam.start();
} catch (Exception e3) {
e3.printStackTrace();
}
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
try {
grabber.start();
} catch (Exception e3) {
e3.printStackTrace();
}
try {
IplImage frame = grabber.grab();
BufferedImage out = frame.getBufferedImage();
File outputfile = new File("c:\\saved.png");
ImageIO.write(out, "png", outputfile);
} catch (Exception e2) {
e2.printStackTrace();
}
}
});
目标已达到,图像已保存。之后,图像保存在我的服务器中,在我的控制台选项卡中出现一条消息
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x776a224d, pid=5864, tid=5576
#
# JRE version: 7.0_05-b05
# Java VM: Java HotSpot(TM) Client VM (23.1-b03 mixed mode, sharing windows-x86 )
# Problematic frame:
# C [ntdll.dll+0x3224d] EtwEventEnabled+0x1ca
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\Users\lucas\workspace\WebcamApplet\bin\hs_err_pid5864.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
通过搜索和谷歌搜索,我找到了解决问题的方法
解决方案
startC.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
OpenCVWebCam webCam = (OpenCVWebCam) cam;
try {
webCam.start();
} catch (Exception e3) {
e3.printStackTrace();
}
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
try {
grabber.start();
} catch (Exception e3) {
e3.printStackTrace();
}
try {
IplImage frame = grabber.grab();
BufferedImage out = frame.getBufferedImage();
File outputfile = new File("c:\\saved.png");
ImageIO.write(out, "png", outputfile);
} catch (Exception e2) {
e2.printStackTrace();
}
}
});
目标已达到,图像已保存。之后,图像保存在我的服务器中,在我的控制台选项卡中出现一条消息
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x776a224d, pid=5864, tid=5576
#
# JRE version: 7.0_05-b05
# Java VM: Java HotSpot(TM) Client VM (23.1-b03 mixed mode, sharing windows-x86 )
# Problematic frame:
# C [ntdll.dll+0x3224d] EtwEventEnabled+0x1ca
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\Users\lucas\workspace\WebcamApplet\bin\hs_err_pid5864.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
@凯瑟,我的问题很清楚。是的,但这不是链接的内容。public static void saveJPG(Image img,String s)抛出IOException{BufferedImage bi=new BufferedImage(640480,BufferedImage.TYPE_INT_RGB);File outputfile=new File(“C:\\saved.jpg”);ImageIO.write(bi,“png”,outputfile);}
->您根本没有使用img。。。因此,您正在保存一个新的空实例BufferedImage@Fildor这是我的saveJPG
方法。我的saveJPG
方法怎么样?@Keyser,我的问题很清楚。是的,但这不是链接的内容。public static void saveJPG(图像img,字符串s)抛出IOException{BufferedImage bi=new BufferedImage(640480,BufferedImage.TYPE_INT_RGB);File outputfile=new File(“C:\\saved.jpg”);ImageIO.write(bi,“png”,outputfile);}
->您根本没有使用img。。。因此,您正在保存一个新的空实例BufferedImage@Fildor这是我的saveJPG
方法。我的saveJPG
方法怎么样?您给saveJPG的映像实例是null
。因此,请检查您的图像检索。您在saveJPG中提供的图像实例为null
。因此,请检查您的图像检索。