Java 基于图像处理和Opencv的像素化人脸跟踪
我正在尝试获取实时处理视频流,以检测人脸并实时对人脸进行像素化。我已经有了跟踪面并在面周围绘制矩形的代码,我还有一个单独的草图来对整个帧进行像素化,但是我无法确定如何将像素化约束在面矩形内。任何关于如何将两者合并的建议都将不胜感激 我的面部跟踪代码是:Java 基于图像处理和Opencv的像素化人脸跟踪,java,opencv,video-processing,face-detection,pixelate,Java,Opencv,Video Processing,Face Detection,Pixelate,我正在尝试获取实时处理视频流,以检测人脸并实时对人脸进行像素化。我已经有了跟踪面并在面周围绘制矩形的代码,我还有一个单独的草图来对整个帧进行像素化,但是我无法确定如何将像素化约束在面矩形内。任何关于如何将两者合并的建议都将不胜感激 我的面部跟踪代码是: import processing.video.*; import java.awt.Rectangle; import gab.opencv.*; OpenCV opencv; Capture video; Rectangle[] faces
import processing.video.*;
import java.awt.Rectangle;
import gab.opencv.*;
OpenCV opencv;
Capture video;
Rectangle[] faces;
void setup() {
size( 640, 480 );
String[] cameras = Capture.list();
video = new Capture(this, cameras[0]);
opencv = new OpenCV(this, width, height);
opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);
faces = opencv.detect();
frameRate(24.0);
video.start();
}
void draw() {
opencv.loadImage(video);
image(video, 0, 0);
video.read();
faces = opencv.detect(1.2, 3, 0, 40, 400); //adjust last two numbers to give min and max for face size
noFill();
stroke(255, 20, 255);
strokeWeight(2);
for (int i = 0; i < faces.length; i++) {
rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
}
}
导入处理。视频。*;
导入java.awt.Rectangle;
导入gab.opencv.*;
OpenCV-OpenCV;
捕获视频;
矩形[]面;
无效设置(){
尺寸(640480);
String[]cameras=Capture.list();
视频=新捕获(此为摄像机[0]);
opencv=新的opencv(该值、宽度、高度);
opencv.loadCascade(opencv.CASCADE\u FRONTALFACE);
faces=opencv.detect();
帧率(24.0);
video.start();
}
作废提款(){
opencv.loadImage(视频);
图像(视频,0,0);
video.read();
faces=opencv.detect(1.2,3,0,40,400);//调整最后两个数字以给出面部大小的最小值和最大值
noFill();
冲程(255、20、255);
冲程重量(2);
对于(int i=0;i
我的像素代码是:
import processing.video.*;
int blockSize = 25;
int numPixelsWide, numPixelsHigh;
Capture video;
color movColors[];
void setup() {
size(640, 480);
noStroke();
String[] cameras = Capture.list();
video = new Capture(this, cameras[0]);
video.start();
numPixelsWide = width;
numPixelsHigh = height;
println(numPixelsWide);
movColors = new color[numPixelsWide * numPixelsHigh];
}
void draw() {
if (video.available() == true) {
video.read();
video.loadPixels();
int count = 0;
for (int j = 0; j < numPixelsHigh; j++) {
for (int i = 0; i < numPixelsWide; i++) {
movColors[count] = video.get(i*blockSize, j*blockSize);
count++;
}
}
}
background(255);
for (int j = 0; j < numPixelsHigh; j++) {
for (int i = 0; i < numPixelsWide; i++) {
fill(movColors[j*numPixelsWide + i]);
rect(i*blockSize, j*blockSize, blockSize, blockSize);
}
}
}
导入处理。视频。*;
int blockSize=25;
int numPixelsWide,numPixelsHigh;
捕获视频;
颜色【】;
无效设置(){
尺寸(640480);
仰泳();
String[]cameras=Capture.list();
视频=新捕获(此为摄像机[0]);
video.start();
numPixelsWide=宽度;
numPixelsHigh=高度;
println(numPixelsWide);
movColors=新颜色[numPixelsWide*numPixelsHigh];
}
作废提款(){
如果(video.available()==true){
video.read();
loadPixels();
整数计数=0;
对于(int j=0;j