Hello, I have a sketch working to pixelate faces with opencv, however I would like to reverse this, ie. pixelate the background and only have the faces showing as the normal video feed. Is there a way that I can mask out the selected area of pixels for the face from the pixelation? Any advice would be greatly appreciated, my code is below.
1. import processing.video.*;
2. import gab.opencv.*;
3. import java.awt.Rectangle;
4. int blockSize = 25;
5. Capture video;
6. OpenCV opencv;
7. Rectangle[] faces;
8. PImage frame;
9. void setup() {
10. size(640, 480);
11. noStroke();
12. String[] cameras = Capture.list();
13. video = new Capture(this, cameras[0]);
14. opencv = new OpenCV(this, width, height);
15. opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);
16. faces = opencv.detect();
17. frame = createImage(width, height, RGB);
18. frameRate(24.0);
19. video.start();
20. }
21. void draw() {
22. if (video.available() == true)
23. {
24. video.read();
25. frame = video.copy();
26. frame.resize(width, height);
27. image(frame, 0, 0);
28. opencv.loadImage(frame);
29. }
30. faces = opencv.detect(1.2, 3, 0, 40, 500); //adjust last two numbers to give min and max for face size
31. for (int i = 0; i < faces.length; i++) {
32. int x = (faces[i].x * blockSize) / width ;
33. int y = (faces[i].y * blockSize) / height -1;
34. int w = (faces[i].width / blockSize);
35. int h = (faces[i].height / blockSize);
36. pixelate(x + 1, y, w, h+2);
37. }
38. }
39. void pixelate(int startX, int startY, int widthX, int heightY) {
40. frame.loadPixels();
41. for (int y = startY; y < startY + heightY; y++)
42. {
43. for (int x = startX; x < startX + widthX; x++) {
44. fill(frame.get(x*blockSize, y*blockSize));
45. rect(x*blockSize, y*blockSize, blockSize, blockSize);
46. }
47. }
48. }