文章目录
- 调用摄像头
- 录制视频
- 录制带音频的视频
- 人脸识别
- 人脸64关键点
调用摄像头
public class Camera {
public static void main(String[] args) throws FrameGrabber.Exception {
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.start();
CanvasFrame canvasFrame = new CanvasFrame("OpenCV Frame");
canvasFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
canvasFrame.setAlwaysOnTop(true);
canvasFrame.setCanvasSize(800, 600);
while (canvasFrame.isVisible()) {
canvasFrame.showImage(grabber.grab());
}
grabber.close();
}
}
录制视频
public class Recording {
private static final String FILE_NAME = "D://recording.mp4";
@SuppressWarnings("resource")
public static void main(String[] args) throws FrameGrabber.Exception, FrameRecorder.Exception {
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.start();
OpenCVFrameConverter<IplImage> converter = new OpenCVFrameConverter.ToIplImage();
IplImage iplImage = converter.convertToIplImage(grabber.grab());
OpenCVFrameRecorder recorder = new OpenCVFrameRecorder(FILE_NAME, iplImage.width(), iplImage.height());
recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
recorder.setFormat("mp4");
recorder.start();
CanvasFrame canvasFrame = new CanvasFrame("OpenCV Frame");
canvasFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
canvasFrame.setAlwaysOnTop(true);
canvasFrame.setCanvasSize(iplImage.width(), iplImage.height());
Frame image;
while (canvasFrame.isVisible()) {
image = grabber.grab();
canvasFrame.showImage(image);
recorder.record(image);
}
recorder.close();
grabber.close();
}
}
录制带音频的视频
public class Audio {
private final static int SAMPLE_RATE = 44100;
private final static int CHANNEL_NUM = 2;
private static final String FILE_NAME = "D://recording.mp4";
@SuppressWarnings("resource")
public static void main(String[] args) throws FrameGrabber.Exception, FrameRecorder.Exception, LineUnavailableException {
AudioFormat audioFormat = new AudioFormat(SAMPLE_RATE, 16, CHANNEL_NUM, true, false);
DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, audioFormat);
TargetDataLine line = (TargetDataLine) AudioSystem.getLine(dataLineInfo);
line.open(audioFormat);
line.start();
final int audioBufferSize = SAMPLE_RATE * CHANNEL_NUM;
byte[] audioBytes = new byte[audioBufferSize];
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.start();
OpenCVFrameConverter<IplImage> converter = new OpenCVFrameConverter.ToIplImage();
IplImage iplImage = converter.convertToIplImage(grabber.grab());
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(FILE_NAME, iplImage.width(), iplImage.height());
recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
recorder.setFormat("mp4");
recorder.setAudioOption("crf", "0");
recorder.setAudioQuality(0);
recorder.setAudioBitrate(192000);
recorder.setSampleRate(SAMPLE_RATE);
recorder.setAudioChannels(2);
recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
recorder.start();
CanvasFrame canvasFrame = new CanvasFrame("OpenCV Frame");
canvasFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
canvasFrame.setAlwaysOnTop(true);
canvasFrame.setCanvasSize(iplImage.width(), iplImage.height());
Frame image;
while (canvasFrame.isVisible()) {
image = grabber.grab();
canvasFrame.showImage(image);
recorder.record(image);
int nBytesRead = line.read(audioBytes, 0, line.available());
int nSamplesRead = nBytesRead / 2;
short[] samples = new short[nSamplesRead];
ByteBuffer.wrap(audioBytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(samples);
ShortBuffer sBuff = ShortBuffer.wrap(samples, 0, nSamplesRead);
recorder.recordSamples(SAMPLE_RATE, CHANNEL_NUM, sBuff);
}
recorder.close();
grabber.close();
}
}
人脸识别
public class Face {
@SuppressWarnings("resource")
public static void main(String[] args) throws FrameGrabber.Exception {
CascadeClassifier cascadeClassifier = new CascadeClassifier("D:\\Workspace\\javacv-demo\\src\\main\\resources\\haarcascade_frontalface_alt.xml");
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.start();
OpenCVFrameConverter.ToIplImage imageConverter = new OpenCVFrameConverter.ToIplImage();
Frame grab = grabber.grab();
IplImage iplImage = imageConverter.convertToIplImage(grab);
OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
CanvasFrame canvasFrame = new CanvasFrame("OpenCV Frame");
canvasFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
canvasFrame.setAlwaysOnTop(true);
canvasFrame.setCanvasSize(iplImage.width(), iplImage.height());
Frame frame;
while (canvasFrame.isVisible()) {
frame = grabber.grab();
Mat image = converter.convertToMat(frame);
RectVector faces = new RectVector();
cascadeClassifier.detectMultiScale(image, faces);
for (int i = 0; i < faces.size(); i++) {
opencv_imgproc.rectangle(image, faces.get(i), new Scalar().green(255));
}
canvasFrame.showImage(frame);
}
grabber.close();
}
}
人脸64关键点
public class FacemarkDemo {
@SuppressWarnings("resource")
public static void main(String[] args) throws FrameGrabber.Exception {
CascadeClassifier cascadeClassifier = new CascadeClassifier("D:\\Workspace\\javacv-demo\\src\\main\\resources\\haarcascade_frontalface_alt.xml");
Facemark facemark = createFacemarkLBF();
facemark.loadModel("D:\\Workspace\\javacv-demo\\src\\main\\resources\\lbfmodel.yaml");
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.start();
OpenCVFrameConverter.ToIplImage imageConverter = new OpenCVFrameConverter.ToIplImage();
Frame grab = grabber.grab();
IplImage iplImage = imageConverter.convertToIplImage(grab);
OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
CanvasFrame canvasFrame = new CanvasFrame("OpenCV Frame");
canvasFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
canvasFrame.setCanvasSize(iplImage.width(), iplImage.height());
Frame frame;
while (canvasFrame.isVisible()) {
frame = grabber.grab();
Mat image = converter.convertToMat(frame);
RectVector faces = new RectVector();
cascadeClassifier.detectMultiScale(image, faces);
Point2fVectorVector landmarks = new Point2fVectorVector();
if (!image.empty() && faces.size() > 0) {
facemark.fit(image, faces, landmarks);
for (int i = 0; i < landmarks.size(); i++) {
drawFacemarks(image, landmarks.get(i), new Scalar().red(255));
}
}
for (int i = 0; i < faces.size(); i++) {
opencv_imgproc.rectangle(image, faces.get(i), new Scalar().green(255));
}
canvasFrame.showImage(frame);
}
grabber.close();
}
}