Java 需要在同一帧上显示从帧抓取器抓取的图像
我可以流式传输视频并使用帧抓取器捕获检测到的人脸,现在我想显示从帧抓取器类抓取的图像,并且需要显示在同一帧上,即视频流的一侧 \使用frame grabber类从视频中捕获帧的代码。 包装com.ravi.videotoimagesJava 需要在同一帧上显示从帧抓取器抓取的图像,java,opencv,face-detection,javacv,face-recognition,Java,Opencv,Face Detection,Javacv,Face Recognition,我可以流式传输视频并使用帧抓取器捕获检测到的人脸,现在我想显示从帧抓取器类抓取的图像,并且需要显示在同一帧上,即视频流的一侧 \使用frame grabber类从视频中捕获帧的代码。 包装com.ravi.videotoimages import static com.googlecode.javacv.cpp.opencv_core.CV_AA; import static com.googlecode.javacv.cpp.opencv_core.IPL_DEPTH_8U; import s
import static com.googlecode.javacv.cpp.opencv_core.CV_AA;
import static com.googlecode.javacv.cpp.opencv_core.IPL_DEPTH_8U;
import static com.googlecode.javacv.cpp.opencv_core.cvClearMemStorage;
import static com.googlecode.javacv.cpp.opencv_core.cvCreateImage;
import static com.googlecode.javacv.cpp.opencv_core.cvGetSeqElem;
import static com.googlecode.javacv.cpp.opencv_core.cvGetSize;
import static com.googlecode.javacv.cpp.opencv_core.cvLoad;
import static com.googlecode.javacv.cpp.opencv_core.cvPoint;
import static com.googlecode.javacv.cpp.opencv_core.cvRectangle;
import static com.googlecode.javacv.cpp.opencv_core.cvSetImageROI;
import static com.googlecode.javacv.cpp.opencv_highgui.cvLoadImage;
import static com.googlecode.javacv.cpp.opencv_highgui.cvSaveImage;
import static com.googlecode.javacv.cpp.opencv_highgui.cvShowImage;
import static com.googlecode.javacv.cpp.opencv_highgui.cvWaitKey;
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_BGR2GRAY;
import static com.googlecode.javacv.cpp.opencv_imgproc.cvCvtColor;
import static com.googlecode.javacv.cpp.opencv_objdetect.CV_HAAR_DO_CANNY_PRUNING;
import static com.googlecode.javacv.cpp.opencv_objdetect.cvHaarDetectObjects;
import com.googlecode.javacpp.Loader;
import com.googlecode.javacv.FrameGrabber;
import com.googlecode.javacv.FrameGrabber.Exception;
import com.googlecode.javacv.OpenCVFrameGrabber;
import com.googlecode.javacv.cpp.opencv_core.CvMemStorage;
import com.googlecode.javacv.cpp.opencv_core.CvRect;
import com.googlecode.javacv.cpp.opencv_core.CvScalar;
import com.googlecode.javacv.cpp.opencv_core.CvSeq;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
import com.googlecode.javacv.cpp.opencv_objdetect;
import com.googlecode.javacv.cpp.opencv_objdetect.CvHaarClassifierCascade;
//import static com.googlecode.javacv.cpp.opencv_highgui.cvNamedWindow;
//import com.googlecode.javacv.CanvasFrame;
//import com.googlecode.javacv.VideoInputFrameGrabber;
public class faceRecongitionwitdetection {
public static final String XML_FILE = "D:\\l\\OpenCV\\haarcascade_frontalface_default.xml";
private static final int SCALE = 1;
@SuppressWarnings("unused")
private static boolean isRunning = true;
@SuppressWarnings("unused")
public static void main(String[] args) throws Exception {
// CanvasFrame canvas = new CanvasFrame("Camera");
// canvas.setDefaultCloseOperation(CanvasFrame.EXIT_ON_CLOSE);
// canvas.addWindowListener(new SetBoolean());
IplImage image;
FrameGrabber grabber = new OpenCVFrameGrabber("D:\\l\\OpenCV\\jobs.mp4");
if (grabber == null) {
System.out.println("!!! Failed OpenCVFrameGrabber");
return;
}
try {
grabber.start();
IplImage frame = null;
int i = 1;
int frame_counter = 1;
while (true) {
frame = grabber.grab();
if (frame == null) {
System.out.println("!!! Failed grab");
break;
}
IplImage grayImg = cvCreateImage(cvGetSize(frame),
IPL_DEPTH_8U, 1);
cvCvtColor(frame, grayImg, CV_BGR2GRAY);
if ((frame_counter % 500) == 0) {
// cvSaveImage(i + "teja.jpg", grayImg);
detect(grayImg);
cvShowImage("Result", grayImg);
cvSaveImage(i + "teja.jpg", grayImg);
String xyz = i + "teja.jpg";
detector(xyz);
}
int key = cvWaitKey(1);
if (key == 100) {
break;
}
frame_counter++;
i++;
}
} catch (Exception e) {
System.out.println("!!! Exception");
}
}
public static void detect(IplImage src) {
// IplImage grayImg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
// cvCvtColor(src, grayImg, CV_BGR2GRAY);
CvHaarClassifierCascade cascade = new CvHaarClassifierCascade(
cvLoad(XML_FILE));
CvMemStorage storage = CvMemStorage.create();
CvSeq sign = cvHaarDetectObjects(src, cascade, storage, 3, 2,
CV_HAAR_DO_CANNY_PRUNING);
cvClearMemStorage(storage);
int total_Faces = sign.total();
for (int i = 0; i < total_Faces; i++) {
CvRect r = new CvRect(cvGetSeqElem(sign, i));
cvRectangle(src, cvPoint(r.x(), r.y()),
cvPoint(r.width() + r.x(), r.height() + r.y()),
CvScalar.GREEN, 3, CV_AA, 0);
}
}
public static void detector(String grab) {
if (grab.length() < 0) {
System.out.println("No Input File");
return;
}
System.out.println("Starting OpenCV...");
// preload the opencv_objdetect module to work around a known bug
Loader.load(opencv_objdetect.class);
// load an image
System.out.println("Loading image from " + grab);
IplImage origImg = cvLoadImage(grab);
IplImage grayImg = cvCreateImage(cvGetSize(origImg), IPL_DEPTH_8U, 1);
cvCvtColor(origImg, grayImg, CV_BGR2GRAY);
CvMemStorage storage = CvMemStorage.create();
CvHaarClassifierCascade cascade = new CvHaarClassifierCascade(
cvLoad(XML_FILE));
System.out.println("Detecting faces...");
CvSeq faces = cvHaarDetectObjects(grayImg, cascade, storage, 3, 2,
CV_HAAR_DO_CANNY_PRUNING);
cvClearMemStorage(storage);
// iterate over the faces and draw yellow rectangles around them
int total = faces.total();
System.out.println("Found " + total + " face(s)");
for (int i = 0; i < total; i++) {
CvRect r = new CvRect(cvGetSeqElem(faces, i));
cvSetImageROI(grayImg, r);
cvRectangle(grayImg, cvPoint(r.x() * SCALE, r.y() * SCALE), // undo
// the
// scaling
cvPoint((r.x() + r.width()) * SCALE, (r.y() + r.height())
* SCALE), CvScalar.BLUE, 6, CV_AA, 0);
if (total > 0) {
// int j=1;
System.out.println("Saving marked-faces version of " + grab
+ " in " + grab);
cvSaveImage(grab, grayImg);
}
}
}
}
import static com.googlecode.javacv.cpp.opencv_core.CV_AA;
导入静态com.googlecode.javacv.cpp.opencv_core.IPL_DEPTH_8U;
导入静态com.googlecode.javacv.cpp.opencv_core.cvClearMemStorage;
导入静态com.googlecode.javacv.cpp.opencv_core.cvCreateImage;
导入静态com.googlecode.javacv.cpp.opencv_core.cvgetsequelem;
导入静态com.googlecode.javacv.cpp.opencv_core.cvGetSize;
导入静态com.googlecode.javacv.cpp.opencv_core.cvLoad;
导入静态com.googlecode.javacv.cpp.opencv_core.cvPoint;
导入静态com.googlecode.javacv.cpp.opencv_core.cvRectangle;
导入静态com.googlecode.javacv.cpp.opencv_core.cvSetImageROI;
导入静态com.googlecode.javacv.cpp.opencv_highgui.cvLoadImage;
导入静态com.googlecode.javacv.cpp.opencv_highgui.cvSaveImage;
导入静态com.googlecode.javacv.cpp.opencv_highgui.cvShowImage;
导入静态com.googlecode.javacv.cpp.opencv_highgui.cvWaitKey;
导入静态com.googlecode.javacv.cpp.opencv_imgproc.CV_bgr2;
导入静态com.googlecode.javacv.cpp.opencv_imgproc.cvtcolor;
导入静态com.googlecode.javacv.cpp.opencv\u objdetect.CV\u HAAR\u DO\u CANNY\u修剪;
导入静态com.googlecode.javacv.cpp.opencv_objdetect.cvhaardeticobjects;
导入com.googlecode.javacpp.Loader;
导入com.googlecode.javacv.FrameGrabber;
导入com.googlecode.javacv.FrameGrabber.Exception;
导入com.googlecode.javacv.OpenCVFrameGrabber;
导入com.googlecode.javacv.cpp.opencv_core.CvMemStorage;
导入com.googlecode.javacv.cpp.opencv_core.CvRect;
导入com.googlecode.javacv.cpp.opencv_core.CvScalar;
导入com.googlecode.javacv.cpp.opencv_core.CvSeq;
导入com.googlecode.javacv.cpp.opencv_core.IplImage;
导入com.googlecode.javacv.cpp.opencv_objdetect;
导入com.googlecode.javacv.cpp.opencv_objdetect.CvHaarClassifierCascade;
//导入静态com.googlecode.javacv.cpp.opencv_highgui.cvNamedWindow;
//导入com.googlecode.javacv.CanvasFrame;
//导入com.googlecode.javacv.VideoInputFrameGrabber;
公共类faceRecongitionwitdetection{
公共静态最终字符串XML\u FILE=“D:\\l\\OpenCV\\haarcascade\u frontalface\u default.XML”;
专用静态最终整数刻度=1;
@抑制警告(“未使用”)
私有静态布尔值isRunning=true;
@抑制警告(“未使用”)
公共静态void main(字符串[]args)引发异常{
//画布框画布=新画布框(“相机”);
//canvas.setDefaultCloseOperation(CanvasFrame.EXIT_ON_CLOSE);
//addWindowListener(新的SetBoolean());
图像;
FrameGrabber grabber=新的OpenCVFrameGrabber(“D:\\l\\OpenCV\\jobs.mp4”);
如果(抓取器==null){
System.out.println(!!!失败的OpenCVFrameGrabber);
返回;
}
试一试{
grabber.start();
IplImage frame=null;
int i=1;
int frame_计数器=1;
while(true){
frame=grabber.grab();
if(frame==null){
System.out.println(“!!!抓取失败”);
打破
}
IplImage grayImg=cvCreateImage(cvGetSize(帧),
IPL_深度_8U,1);
CVT颜色(边框、灰色、CV_bgr2灰色);
如果((帧计数器%500)==0){
//cvSaveImage(i+“teja.jpg”,灰度);
检测(灰度);
cvShowImage(“结果”,灰度);
cvSaveImage(i+“teja.jpg”,灰度);
字符串xyz=i+“teja.jpg”;
探测器(xyz);
}
int key=cvWaitKey(1);
如果(键==100){
打破
}
帧计数器++;
i++;
}
}捕获(例外e){
System.out.println(!!!异常);
}
}
公共静态空隙检测(IplImage src){
//IplImage grayImg=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
//CVT颜色(src、灰色、CV_bgr2灰色);
CvHaarClassifierCascade级联=新CvHaarClassifierCascade(
cvLoad(XML_文件);
CvMemStorage=CvMemStorage.create();
CvSeq sign=CVHAARDECTOBJECTS(src、级联、存储、3、2、,
CV_HAAR_DO_CANNY_修剪);
cvClearMemStorage(存储);
int total_Faces=sign.total();
对于(int i=0;i