?? snp.java
字號:
package bin;
import java.lang.Math;
import java.io.File;
import java.io.FileOutputStream;
import java.awt.image.*;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.Rectangle;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/******************************************************************************
*SNP(基于統計的背景消除算法): 該算法的主要功能是對室內環境條件下的人的陰影檢*
*測和背景消除,實現將運動前景,運動對象陰影,靜態背景三者的分離. *
*版本號:1.0 *
*作者:happyjay(段俊杰) *
*程序接口:a.保存圖像接口;b.分布曲線接口;c.二值圖(原圖)接口;d.去陰影接口;e.圖 *
*像膨脹接口 *
*本程序主接口為SNPProcess(),主要用來進行SNP算法處理 *
******************************************************************************/
public class SNP
{
/*輸入學習圖片數*/
static int sampleImageNum = 0;
/*是否保存圖像*/
boolean saved = false;
/*是否需要畫出分布圖*/
boolean paintpic = false;
/*是否需要二值顯示*/
boolean binaryvalue = false;
/*是否需要去陰影*/
boolean subshadow = false;
/*是否需要膨脹處理*/
boolean wantpengzhang = false;
/*計算每幀光線強度總和*/
boolean totalalpha = false;
/*計算Y分量*/
boolean gety = false;
/*是否使用滑桿*/
boolean useslider = false;
/*閾值設置*/
float slidervalue = 3.0f;
float slidervalue2 = -3.0f;
/*輸入圖象寬度,高度,面積域 */
int w=0;
int h=0;
int w_h=0;
/*輸入源圖象*/
Image src = null;
/*抓取圖像參數*/
PixelGrabber grabber = null;
ColorModel model = null;
/*存取圖像象素數組*/
int pixels[];
boolean boolpixel[];
/*r,g,b值存放數組,存放圖象RGB值*/
float r[];
float g[];
float b[];
/*為求Y分量,將RGB存儲在同一個數組*/
int []rgb;
/*r,g,b期望值存放數組*/
float ur[];
float ug[];
float ub[];
/*各幀r,g,b方差值存放數組*/
float sr[];
float sg[];
float sb[];
/*二值化數組,用于二值化處理*/
boolean binary[];
boolean binarytemp[];
/*亮度失真*/
float ma[];
/*象素點亮度偏移量數組α[]*/
float α[];
/*規格化亮度偏移量和色度偏移量存放數組*/
float α_[];
/*暫存數組(提高計算效率)*/
float A[];
float B[];
float C[];
float D[];
/*各個象素點的期望值的方差和*/
float tempr[];
float tempg[];
float tempb[];
/*光線強度總和*/
float tempalpha;
/*存儲上次光線強度和*/
float lastalpha;
/*當前幀與上一幀的光線強度差異*/
float deltaalpha;
/*各個象素點的亮度失真和色度失真的方差和*/
float tempx[];
float tempy[];
/*α和cd的最大最小值*/
float max_α_;
float min_α_;
/*α和CD的分布曲線數組*/
int a_map[];
/*坐標系中原點值(即縱坐標最大值時橫坐標的值)*/
float Max_map;
int originX;
/*最大最小規格化值出現的點的位置*/
int max_location = 0;
int min_location = 0;
/****************************************************/
/*設置檢測區域*/
public void setDetectArea(Rectangle rec)
{
int startX = (int)rec.getX();
int startY = (int)rec.getY();
int endX = startX + (int)rec.getWidth();
int endY = startY + (int)rec.getHeight();
if(startX < 0) startX = 0;
if(startY < 0) startY = 0;
if(endX > w) endX = w;
if(endY > h) endY = h;
for(int y = startY; y < endY; y++)
for(int x = startX; x < endX; x++)
{
boolpixel[y * w + x] = true;
}
}
/*默認區域*/
public void setDefaultArea()
{
for(int y = 0; y < h; y++)
for(int x = 0; x < w; x++)
{
boolpixel[y * w + x] = true;
}
}
/*設置閾值*/
public void setSlidervalue(float slidervalue)
{
this.slidervalue = slidervalue;
}
/*獲取閾值*/
public float getSlidervalue()
{
return this.slidervalue;
}
/*設置陰影閾值*/
public void setSlidervalue2(float slidervalue2)
{
this.slidervalue2 = slidervalue2;
}
/*獲取陰影閾值*/
public float getSlidervalue2()
{
return this.slidervalue2;
}
/*設置是否要計算totalalpha的值*/
public void setTotalalpha(boolean totalalpha)
{
this.totalalpha = totalalpha;
}
/*得到當前輸出的值*/
public float getTempalpha()
{
return this.tempalpha;
}
/*設置是否需要二值輸出,默認為原圖輸出*/
public void setBinaryvalue(boolean binaryvalue)
{
this.binaryvalue = binaryvalue;
}
/*得到當前輸出的狀態*/
public boolean getBinaryvalue()
{
return this.binaryvalue;
}
/*設置是否需要膨脹處理*/
public void setPengzhang(boolean wantpengzhang)
{
this.wantpengzhang = wantpengzhang;
}
/*獲得膨脹狀態*/
public boolean getPengzhang()
{
return this.wantpengzhang;
}
/*設置是否需要保存處理后的圖像*/
public void setSaved(boolean saved)
{
this.saved = saved;
}
/*獲得保存狀態*/
public boolean getSaved()
{
return this.saved;
}
/*設置是否需要畫出分布曲線*/
public void setPic(boolean paintpic)
{
this.paintpic = paintpic;
}
/*獲得分布曲線狀態參數*/
public boolean getPic()
{
return this.paintpic;
}
/*設置是否計算Y分量*/
public void setY(boolean gety)
{
this.gety = gety;
}
public void setUseSlider(boolean useslider)
{
this.useslider = useslider;
}
public boolean getUseSlider()
{
return this.useslider;
}
/***************************************************/
/**
*以下構造函數,初始化數據
**/
public SNP(BufferedImage inImage) throws Exception
{
/*輸入初始圖像,進行寬度和高度初始化*/
src = inImage;
w = src.getWidth(null);
h = src.getHeight(null);
w_h = w * h;
boolpixel = new boolean[w_h];
/*r,g,b值存放數組,存放圖象RGB值*/
r = new float[w_h];
g = new float[w_h];
b = new float[w_h];
/*申請3個浮點空間存放每個象素點的RGB值*/
rgb = new int[3];
/*r,g,b期望值存放數組*/
ur = new float[w_h];
ug = new float[w_h];
ub = new float[w_h];
/*各幀r,g,b方差值存放數組*/
sr = new float[w_h];
sg = new float[w_h];
sb = new float[w_h];
/*二值化數組初始化*/
binary = new boolean[w_h];
binarytemp = new boolean[w_h];
/*記錄期望值方差和初始化*/
tempr = new float[w_h];
tempg = new float[w_h];
tempb = new float[w_h];
/*記錄亮度失真和色度失真的和*/
tempx = new float[w_h];
tempy = new float[w_h];
/*亮度失真和色度失真*/
ma = new float[w_h];
/*象素點亮度偏移量數組α[]和色度偏移量數組cd[]*/
α = new float[w_h];
/*初始化預先存儲數組*/
A = new float[w_h];
B = new float[w_h];
C = new float[w_h];
D = new float[w_h];
/*規格化亮度偏移量和色度偏移量存放數組*/
α_ = new float[w_h];
/*初始化圖形參數*/
a_map = new int[10000];
/*初始化坐標原點值*/
Max_map = 0.0f;
originX = 0;
}
/***************************************************/
/**
*SNP處理函數,參數為輸入處理圖像
**/
public BufferedImage SNPProcess(BufferedImage inImage)
throws Exception
{
RGBToYUV rgbtoyuv = new RGBToYUV();
/*輸入模板圖片數增加1*/
sampleImageNum++;
/*初始化每幀光線強度的和*/
tempalpha = 0;
System.out.println(sampleImageNum + "SNPProcess");
long t0 = System.currentTimeMillis();
/*輸入視頻圖像*/
src = inImage;
w = src.getWidth(null);
h = src.getHeight(null);
w_h = w * h;
/*存取圖像象素數組*/
int pixels[] = new int[w_h];
/**
*以下讀入模版圖片,將圖像的所有象素存入pixels數組
**/
grabber = new PixelGrabber(src, 0, 0, w, h, pixels, 0, w);
try
{
grabber.grabPixels();
}catch(InterruptedException e)
{
e.printStackTrace();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -