Processing玩抠图

突然兴起想玩一下抠图,试着用自带的Example\video来改,花了一个中午做了个小样:

分别是白色为底与黑色为底的效果,代码如下:

 1 import processing.video.*;
 2 int numPixels;
 3 int[] backgroundPixels;
 4 Capture video;
 5 PImage img;
 6
 7 void setup() {
 8   size(640, 480);
 9   video = new Capture(this, width, height);
10   video.start();
11   numPixels = video.width * video.height;
12   backgroundPixels = new int[numPixels];
13   img = new PImage(video.width, video.height);//make a copy of video.
14   frameRate(30);
15 }
16
17 void draw() {
18   if (video.available()) {
19     video.read();
20   }
21   img = video;//use img as a template
22   img.loadPixels();
23   for (int i = 0; i < numPixels; i++) {
24     color currColor = img.pixels[i];
25     color bkgdColor = backgroundPixels[i];
26     int currR = (currColor >> 16) & 0xFF;
27     int currG = (currColor >> 8) & 0xFF;
28     int currB = currColor & 0xFF;
29     int bkgdR = (bkgdColor >> 16) & 0xFF;
30     int bkgdG = (bkgdColor >> 8) & 0xFF;
31     int bkgdB = bkgdColor & 0xFF;
32     int diffR = abs(currR - bkgdR);
33     int diffG = abs(currG - bkgdG);
34     int diffB = abs(currB - bkgdB);
35     int td = 20;//set threshold to 20 pixcels;
36
37     //check each pixel of the frame, set background pixels to white.
38     if (diffR >td||diffG>td||diffB>td) {
39       img.pixels[i] = color(currR, currG, currB);
40     } else {
41       img.pixels[i] = color(255, 255, 255);
42     }
43   }
44   img.updatePixels();
45   //use mouse to adjust the blur effect;
46   fastblur(img,(int)map(mouseX,0,width,1,20));
47   //display image.
48   image(img, 0, 0);
49 }
50
51 void keyPressed() {
52   if (key == ‘ ‘) {
53     arraycopy(img.pixels, backgroundPixels);
54   }
55 } 
 1 void fastblur(PImage img,int radius){
 2
 3   if (radius<1){
 4     return;
 5   }
 6   int w=img.width;
 7   int h=img.height;
 8   int wm=w-1;
 9   int hm=h-1;
10   int wh=w*h;
11   int div=radius+radius+1;
12   int r[]=new int[wh];
13   int g[]=new int[wh];
14   int b[]=new int[wh];
15   int rsum,gsum,bsum,x,y,i,p,p1,p2,yp,yi,yw;
16   int vmin[] = new int[max(w,h)];
17   int vmax[] = new int[max(w,h)];
18   int[] pix=img.pixels;
19   int dv[]=new int[256*div];
20   for (i=0;i<256*div;i++){
21      dv[i]=(i/div);
22   }
23
24   yw=yi=0;
25
26   for (y=0;y<h;y++){
27     rsum=gsum=bsum=0;
28     for(i=-radius;i<=radius;i++){
29       p=pix[yi+min(wm,max(i,0))];
30       rsum+=(p & 0xff0000)>>16;
31       gsum+=(p & 0x00ff00)>>8;
32       bsum+= p & 0x0000ff;
33    }
34     for (x=0;x<w;x++){
35
36       r[yi]=dv[rsum];
37       g[yi]=dv[gsum];
38       b[yi]=dv[bsum];
39
40       if(y==0){
41         vmin[x]=min(x+radius+1,wm);
42         vmax[x]=max(x-radius,0);
43        }
44        p1=pix[yw+vmin[x]];
45        p2=pix[yw+vmax[x]];
46
47       rsum+=((p1 & 0xff0000)-(p2 & 0xff0000))>>16;
48       gsum+=((p1 & 0x00ff00)-(p2 & 0x00ff00))>>8;
49       bsum+= (p1 & 0x0000ff)-(p2 & 0x0000ff);
50       yi++;
51     }
52     yw+=w;
53   }
54
55   for (x=0;x<w;x++){
56     rsum=gsum=bsum=0;
57     yp=-radius*w;
58     for(i=-radius;i<=radius;i++){
59       yi=max(0,yp)+x;
60       rsum+=r[yi];
61       gsum+=g[yi];
62       bsum+=b[yi];
63       yp+=w;
64     }
65     yi=x;
66     for (y=0;y<h;y++){
67       pix[yi]=0xff000000 | (dv[rsum]<<16) | (dv[gsum]<<8) | dv[bsum];
68       if(x==0){
69         vmin[y]=min(y+radius+1,hm)*w;
70         vmax[y]=max(y-radius,0)*w;
71       }
72       p1=x+vmin[y];
73       p2=x+vmax[y];
74
75       rsum+=r[p1]-r[p2];
76       gsum+=g[p1]-g[p2];
77       bsum+=b[p1]-b[p2];
78
79       yi+=w;
80     }
81   }
82 }

代码主要分为2个部分:

1. main

获取摄像头帧video,使用PImage对象img作为缓存帧,通过空格保存对比帧background,使用阀值将对比帧与缓存帧之间相同的部分存为指定颜色(例如:白色、黑色),再显示不同的部分。

2. fastblur

简单高斯模糊,本来是想进行边缘柔化的,结果发现这种方法不行,看来只有另外找了。

Processing玩抠图

时间: 2024-07-29 12:59:13

Processing玩抠图的相关文章

Processing 中玩增强现实 Argument Reality

其实2009年Processing就能做AR了,只是我不知道而已~ 需要以下几个东西: 1.JMyron 2.GSVideo 3.nyar4psg 4.Picking 5.OBJLoader 或者大伙也可以去下[鲸男]的ARforProcessingAll.zip包,但是里面的东西已经很老了,而且有些小错误,可能不兼容2.0以后的Processing. 装好上面的库以后 1.直接进libraries/nyar4psg/samples里面随便运行一个 2.打开libraries/nyar4psg/

玩转spring boot——properties配置

前言 在以往的java开发中,程序员最怕大量的配置,是因为配置一多就不好统一管理,经常出现找不到配置的情况.而项目中,从开发测试环境到生产环境,往往需要切换不同的配置,如测试数据库连接换成生产数据库连接,若有一处配错或遗漏,就会带来不可挽回的损失.正因为这样,spring boot给出了非常理想的解决方案——application.properties.见application-properties的官方文档:http://docs.spring.io/spring-boot/docs/curr

转 中国的支付清算体系是怎么玩的?

[纯干货]中国的支付清算体系是怎么玩的? 原文链接 我一直对支付感兴趣.2015年,因为工作需要,接触过好多第三方支付公司,做过支付路由,也处理了很多支付异常情况.但是支付中的清算部分一直不太理解,不知道银联在联结各方的时候是如何发挥作用的.最近一次厦大校友聚会上来了不少银行IT的同事,趁机向民生和工行的同学请教之后,做了一些总结,供希望了解支付清算的朋友们参考. ----------这是正文的分割线---------- 中国的支付清算有两套体系 当你去ATM取钱时,用的是央行的CNAPS(中国

[转]一步一步玩控件:自定义TabControl——从山寨Safari开始

作者:野比 ([email protected]) 时间:May, 2012 封面图片为野比原创,请勿未经允许私自引用 #1-1 嗯,各位,又是我,生物钟颠倒的家伙. 今天我要山寨的是大名鼎鼎的Apple,传说中的「被山寨之王」. 没错,都被我山寨好几次了. 说起Apple,相信大家对他家的各种产品,不管他软还是硬,都有相当的好感. 最近Apple把自家的Web浏览器Safari升级到了第5版,并同步推出了Windows版,支持WinXP开始的全部Windows版本. 不得不说,这是一个很给力的

腾讯分分彩源码带龙虎和玩法自言自语Spring依赖注入(XML配置)

至于基于XML依赖注入的过程,首先要找一个比较合适的入口,那就是getBean.那么具体是怎么实现的呢?首先写个测试方法: ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("application-common.xml","application-beans.xml","application_jdbc.xml");Object obj = app.g

Cesium源码剖析---Post Processing之物体描边(Silhouette)

Cesium在1.46版本中新增了对整个场景的后期处理(Post Processing)功能,包括模型描边.黑白图.明亮度调整.夜视效果.环境光遮蔽等.对于这么炫酷的功能,我们绝不犹豫,先去翻一翻它的源码,掌握它的实现原理. 1 后期处理的原理 后期处理的过程有点类似于照片的PS.生活中拍摄了一张自拍照,看到照片后发现它太暗了,于是我们增加亮度得到了一张新的照片.在增加亮度后发现脸上的痘痘清晰可见,这可不是我们希望的效果,于是再进行一次美肤效果处理.在这之后可能还会进行n次别的操作,直到满足我们

玩转 SpringBoot 2 之整合 JWT 下篇

前言 在<玩转 SpringBoot 2 之整合 JWT 上篇> 中介绍了关于 JWT 相关概念和JWT 基本使用的操作方式.本文为 SpringBoot 整合 JWT 的下篇,通过解决 App 用户登录 Session 问题的实战操作,带你更深入理解 JWT.通过本文你还可以了解到如下内容: SpringBoot 使用拦截器的实际应用 SpringBoot 统一异常处理 SpringBoot 快速搭建 RESTful Api 关于生成JWT 操作请参考 <玩转 SpringBoot 2

Spring Cloud ZooKeeper集成Feign的坑2,服务调用了一次后第二次调用就变成了500,错误:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.n

错误如下: 2017-09-19 15:05:24.659 INFO 9986 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]56528192: startup date [Tue Sep 19 15:05:24 CST 2017]; root of context hierarchy 2017-09-19 15:05:24.858 INFO 9986 --

【精品】北京赛车计划冠军定位玩法技巧

車車是一種投資,我們的目標是:細水長流,見好就收,不求日金千金,只求長期穩定!許多人賠本的原因:1. 資金不足,卻大把下注,跟到第4期不出,錢不夠了,心慌了.有人孤注一擲,衝到第5期中了,嚇的半死.有人不敢跟,第5期出號了,氣死, 然後再跟新計劃,沒錢了,郁悶死.這兩種做法都不對,既然是以投資的心態做事,就應該計劃好翻倍的本錢,做到99%的穩賺,狀況不對就要及時止損. 看著連續中,就是不敢跟,最後咬牙跟了,馬上挂了.于是開始哭,我運氣咋這麽差.不買就中,一買就挂.相反,有些人專門等挂,一挂就上,