本人是剛學才C++不久,很多不會 ,還請大神指教。我想編出能夠檢測膚色的程式,然后成語開始是這樣的
byte*Line ;
imgDraw -> Picture = img1 -> Picture;
for (int y= 0; y < imgDraw -> Picture -> Bitmap -> Height ; ++y){
Line = (Byte*) imgDraw -> Picture -> Bitmap -> ScanLine[y];
for(int x = 0; x < imgDraw -> Picture ->Bitmap -> Width;++x){
unsigned short Red = Line [x*3+2],
Green = Line [x*3+1],
Blue = Line [x*3];
接下來就不會了,于是我找了一個膚色檢測的成語是下面這樣的
for (Y = 0; Y < Height; Y++)
{
Pointer = Scan0 + Y * Stride;
SkinP = SkinScan0 + Y * SkinStride;
for (X = 0; X < Width; X++)
{
Blue = *Pointer; Green = *(Pointer + 1); Red = *(Pointer + 2);
if (Red > 95 && Green > 40 && Blue > 20 && Red > Blue && Red > Green && Math.Abs(Red - Green) > 15)
{
if (Blue >= Green)
{
Max = Blue;
Min = Green;
}
else
{
Max = Green;
Min = Blue;
}
if (Red > Max)
Max = Red;
else if (Red < Min)
Min = Red;
if (Max - Min > 15) *SkinP = 255;
}
Pointer += 3;
SkinP++;
}
如何運用找出來的這個程式變換成開始用的那個程式, 有沒有人幫我把第一個程式補充好啊?
uj5u.com熱心網友回復:
這個你做的和qoror相似,上次幫他解決了影像差異比較的問題uj5u.com熱心網友回復:
你能幫我補充一下第一個程式嗎?就是運用下面的程式帶到第一個程式里面,不花多少時間的呀。uj5u.com熱心網友回復:
我雖然不知道你的演算法是個設那么思路,但我根據你提供的那段三方代碼的原理寫出了一個全新的最簡代碼,效果和原版所達到的效果完全一致,在這里提供給你,希望對你有所幫助,如果你滿意的話請結貼!void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(OpenPictureDialog1->Execute()!=true){
return;
}
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
for (int Y = 0; Y < Image1->Height; Y++)
{
for (int X = 0; X < Image1->Width; X++)
{
int rgb=Image1->Canvas->Pixels[X][Y];
BYTE R = GetRValue(rgb);
BYTE G = GetGValue(rgb);
BYTE B = GetBValue(rgb);
if (R > 95 && G > 40 && B > 20 && R > B && R > G && abs(R - G) > 15)
{
}else{
Image2->Canvas->Pixels[X][Y]=clRed;
}
}
}
}
放一個OpenPictureDialog,兩個Image和一個按鈕即可
uj5u.com熱心網友回復:
主意這個代碼中載入的是BMP影像uj5u.com熱心網友回復:



uj5u.com熱心網友回復:
樓上代碼可以。void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(OpenPictureDialog1->Execute()!=true){
return;
}
int Max,Min;
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
//Image1->Stretch = True;
for (int Y = 0; Y < Image1->Height; Y++)
{
for (int X = 0; X < Image1->Width; X++)
{
int rgb=Image1->Canvas->Pixels[X][Y];
BYTE R = GetRValue(rgb);
BYTE G = GetGValue(rgb);
BYTE B = GetBValue(rgb);
if (R > 95 && G > 40 && B > 20 && R > B && R > G && abs(R - G) > 15)
{
if (B >= G)
{
Max = B;
Min = G;
}
else
{
Max = G;
Min = B;
}
if (R > Max)
Max = R;
else if (R < Min)
Min = R;
//人臉顏色保留
if (Max - Min > 15) Image2->Canvas->Pixels[X][Y] = rgb;
//Image2->Canvas->Pixels[X][Y] = 255;
}else{
//Image2->Canvas->Pixels[X][Y] = 255; //=clRed
Image2->Canvas->Pixels[X][Y] = clWhite;
}
}
}
}
uj5u.com熱心網友回復:
實際上要進行邊界檢測吧?uj5u.com熱心網友回復:
實際上在我的代碼中不需要uj5u.com熱心網友回復:
這個老兄不知道上哪里去了,看來一時半會不會結貼了轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/114495.html
標籤:基礎類
