之前上多媒體,有一個作業是做視窗程式設計,膚色偵測(just R>G>B,這不是重點)。既然是視窗程式設計,用MFC作為GUI library也是理所當然的,再加上微軟在圖學方面的貢獻,感覺做多媒體的老師都比較prefer 微軟的東西。之前沒寫過視窗程式的經驗,看pcman很推wxWidget 就拿來用了。
我在ms windows上是用wxdevcpp當IDE,還蠻難用的。好像也可以在Vitural Studio用wxWidget,不過看說明超麻煩的... 而且都用VC了當然是用MFC呀xd
我在windows寫的code長成這樣:
//load orginal picture
wxImage img(imgFile, wxBITMAP_TYPE_ANY, 0);
wxBitmap bmp(img);
//link picture to dc
wxMemoryDC srcDc;
srcDc.SelectObject(bmp);
//face detect and mask
wxCoord w, h;
srcDc.GetSize(&w, &h);
for(wxCoord i=0;i<w;i++){
for(wxCoord j=0;j<h;j++){
//get color
wxColour color;
srcDc.GetPixel(i,j,&color);
//R>G>B=R>G&&G>B=R<G||G<B
if(color.Red()<color.Green()||color.Green()<color.Blue()){
srcDc.SetPen(*wxBLACK_PEN);
srcDc.DrawPoint(i,j);
}
}
}
//copy and show picture after mask
wxPaintDC hisDc(this);
hisDc.Blit(400, 10, 320, 240, &srcDc, 0, 0);
這在windows跑起來是ok的,但在linux compile時雖然會過,但是圖片會有問題 。
研究了一下發現linux在DC做處理會不正常,因為wx是在wxImage這層才是保證platform independent的。所以改成在wxImage做處理,順便整理了一下code。
修改後如下:
//load orginal picture...slow
wxImage img2(imgFile, wxBITMAP_TYPE_ANY, -1);
wxBitmap bmp2(img2);
//link picture to dc
wxMemoryDC srcDc2;
srcDc1.SelectObject(bmp2);
//face detect and mask
int w=img2.GetWidth();
int h=img2.GetHeight();
for(int i=0;i<w;i++){
for(int j=0;j<h;j++){
//get color
unsigned char r=img2.GetRed(i,j);
unsigned char g=img2.GetGreen(i,j);
unsigned char b=img2.GetBlue(i,j);
if(r<g||g<b) img2.SetRGB(i,j,0,0,0);
}
}
wxBitmap bmp2(img2);
//link picture to dc
wxMemoryDC srcDc2;
srcDc2.SelectObject(bmp2);
//copy and show picture after mask
wxPaintDC hisDc(this);
hisDc.Blit(400, 10, 320, 240, &srcDc2, 0, 0);
/*show skin detect END*/

這樣在windows和linux就都ok啦!不過在Mac OS X就不知道了
現在重做的話應該會用OpenCV吧,什麼都準備好啦xd 不過不知道wxWidget和OpenCV能不能好好一起工作呀..

0 意見:
張貼意見