感謝2位前輩幫忙。我現在是完成我要的功能了,但是老闆希望我可以更精確的框出這24個框框。我現在是先框出色板的外框之後在按照邊框的長寬切比例畫出這24個小框框,而我老闆是希望我可以確實的找出這24個色塊之後在框出圖形來,所以請問一下這樣的話該如何下手??? 我目前想到的就是將色板轉成只有邊框是黑色其他色塊都是白色,這樣我就有辦法找出24個色塊,所以我將RGB轉Cr跟Cb加入判斷式中,但是轉出來還是不好,請問還有什麼辦法可以用,謝謝。
int x[2], y[2], x_unit,y_unit;
void findBoundary(TImage *image)
{
Byte **ptr;
int r, g, b, gray, index; image->Picture->Bitmap->PixelFormat = pf24bit;
ptr = new Byte*[image->Picture->Height];
for (int k=0; kPicture->Height; k )
ptr[k] = (Byte*) image->Picture->Bitmap->ScanLine[k]; // up bound
bool skip = false;
for (int row=0; rowPicture->Height; row )
{ index = 0;
for (int col=0; colPicture->Width; col )
{ if ( ptr[row][index]==0 ) // black point meeting
{ y[0] = row;
skip = true;
break;
}
index = 3;
}
if ( skip ) break;
}
// bottom bound
skip = false;
for (int row=image->Picture->Height-1; row>=0; row--)
{ index = 0;
for (int col=0; colPicture->Width; col )
{ if ( ptr[row][index]==0 ) // black point meeting
{ y[1] = row;
skip = true;
break;
}
index = 3;
}
if ( skip ) break;
}
// left bound
skip = false;
for (int col=0; colPicture->Width; col )
{ index = col*3;
for (int row=0; rowPicture->Height; row )
{ if ( ptr[row][index]==0 ) // black point meeting
{ x[0] = col;
skip = true;
break;
}
}
if ( skip ) break;
}
// right bound
skip = false;
for (int col=image->Picture->Width-1; col>=0; col--)
{ index = col*3;
for (int row=0; rowPicture->Height; row )
{ if ( ptr[row][index]==0 ) // black point meeting
{ x[1] = col;
skip = true;
break;
}
}
if ( skip ) break;
} image->Picture->Bitmap->Canvas->Pen->Color = clRed;
image->Picture->Bitmap->Canvas->MoveTo(0,y[0]);
image->Picture->Bitmap->Canvas->LineTo(image->Picture->Width-1,y[0]);
image->Picture->Bitmap->Canvas->MoveTo(0,y[1]);
image->Picture->Bitmap->Canvas->LineTo(image->Picture->Width-1,y[1]);
image->Picture->Bitmap->Canvas->MoveTo(x[0],0);
image->Picture->Bitmap->Canvas->LineTo(x[0],image->Picture->Height-1);
image->Picture->Bitmap->Canvas->MoveTo(x[1],0);
image->Picture->Bitmap->Canvas->LineTo(x[1],image->Picture->Height-1); image->Picture->Bitmap->Canvas->Brush->Style=bsClear;
image->Picture->Bitmap->Canvas->Pen->Color=clYellow; x_unit=(x[1]-x[0])/12;
y_unit=(y[1]-y[0])/8; // ShowMessage("Y[0] = " IntToStr(y[0]) "");
// ShowMessage("Y[1] = " IntToStr(y[1]) "");
// ShowMessage("X[0] = " IntToStr(x[0]) "");
// ShowMessage("X[1] = " IntToStr(x[1]) "");
delete [] ptr;
} void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
if(OpenPictureDialog1->Execute()){
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
Image2->Picture->LoadFromFile(OpenPictureDialog1->FileName);
Image1->Picture->Bitmap->PixelFormat = pf24bit;
Image2->Picture->Bitmap->PixelFormat = pf24bit;
Byte *ptr;
int r,g,b;
int gray,Cb,Cr;
int i,j; for (j=0; jPicture->Bitmap->Height; j )
{
ptr = (Byte *)Image1->Picture->Bitmap->ScanLine[j];
for (i=0; iPicture->Bitmap->Width; i )
{
b = ptr[i*3];
g = ptr[i*3 1];
r = ptr[i*3 2];
gray = 0.299*r 0.587*g 0.114*b;
Cb = - 0.1687*r - 0.3313*g 0.5*b 128;
Cr = 0.5*r - 0.4187*g - 0.0813*b 128; if (gray<22/* && Cr>125&&Cr<129&&Cb>127&&Cb<128*/)
gray = 0;
else
gray = 255; ptr[i*3 ] = (Byte)gray;
ptr[i*3 1] = (Byte)gray;
ptr[i*3 2] = (Byte)gray;
}
}
Image1->Picture->Assign(Image1->Picture->Bitmap);
} findBoundary(Image1); Image2->Picture->Bitmap->Canvas->Brush->Style=bsClear;
Image2->Picture->Bitmap->Canvas->Pen->Color=clYellow;
//第一列//
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit-20),(y[0] y_unit-20),(x[0] x_unit 20),(y[0] y_unit 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*3-20),(y[0] y_unit-20),(x[0] x_unit*3 20),(y[0] y_unit 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*5-20),(y[0] y_unit-20),(x[0] x_unit*5 20),(y[0] y_unit 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*7-20),(y[0] y_unit-20),(x[0] x_unit*7 20),(y[0] y_unit 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*9-20),(y[0] y_unit-20),(x[0] x_unit*9 20),(y[0] y_unit 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*11-20),(y[0] y_unit-20),(x[0] x_unit*11 20),(y[0] y_unit 20)); //第二列//
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit-20),(y[0] y_unit*3-20),(x[0] x_unit 20),(y[0] y_unit*3 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*3-20),(y[0] y_unit*3-20),(x[0] x_unit*3 20),(y[0] y_unit*3 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*5-20),(y[0] y_unit*3-20),(x[0] x_unit*5 20),(y[0] y_unit*3 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*7-20),(y[0] y_unit*3-20),(x[0] x_unit*7 20),(y[0] y_unit*3 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*9-20),(y[0] y_unit*3-20),(x[0] x_unit*9 20),(y[0] y_unit*3 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*11-20),(y[0] y_unit*3-20),(x[0] x_unit*11 20),(y[0] y_unit*3 20)); //第三列//
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit-20),(y[0] y_unit*5-20),(x[0] x_unit 20),(y[0] y_unit*5 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*3-20),(y[0] y_unit*5-20),(x[0] x_unit*3 20),(y[0] y_unit*5 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*5-20),(y[0] y_unit*5-20),(x[0] x_unit*5 20),(y[0] y_unit*5 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*7-20),(y[0] y_unit*5-20),(x[0] x_unit*7 20),(y[0] y_unit*5 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*9-20),(y[0] y_unit*5-20),(x[0] x_unit*9 20),(y[0] y_unit*5 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*11-20),(y[0] y_unit*5-20),(x[0] x_unit*11 20),(y[0] y_unit*5 20)); //第四列//
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit-20),(y[0] y_unit*6.5-20),(x[0] x_unit 20),(y[0] y_unit*6.5 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*3-20),(y[0] y_unit*6.5-20),(x[0] x_unit*3 20),(y[0] y_unit*6.5 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*5-20),(y[0] y_unit*6.5-20),(x[0] x_unit*5 20),(y[0] y_unit*6.5 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*7-20),(y[0] y_unit*6.5-20),(x[0] x_unit*7 20),(y[0] y_unit*6.5 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*9-20),(y[0] y_unit*6.5-20),(x[0] x_unit*9 20),(y[0] y_unit*6.5 20));
Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*11-20),(y[0] y_unit*6.5-20),(x[0] x_unit*11 20),(y[0] y_unit*6.5 20)); }
發表人 - iii0628 於 2005/10/05 14:50:39