求得圖形中心點後算圖的大小不行的問題 |
答題得分者是:diablo09105
|
eulor2000
一般會員 發表:51 回覆:34 積分:17 註冊:2008-11-18 發送簡訊給我 |
這個程由image1 輸入一圖片 -->由二值化--->計算圖形中心點--->計算圖形大小(不行) 因為我準備拮取圖片中的圖形....程式碼如下 請資深板友指點
Byte *ptr,*ptr1;//用來指像素行的指標 int r,g,b;//rgb三原色 int gray;//用來存灰階化後的值 int x_center,y_center,count=0; unsigned int x_total,y_total; int r_length; TPoint x[2000]; TPoint P1[1]; TPoint P2[1]; Graphics::TBitmap *Bmps = new Graphics::TBitmap(); //定義一個圖象句柄// Graphics::TBitmap *Bmp1 = new Graphics::TBitmap(); //定義一個new TBitmap Bmps->Assign(Form1->Image1->Picture->Bitmap); // 將Image1 的Bitmap轉存到TBitmap Bmp for(int d = 0; d < Bmps->Height; d ) { ptr = (Byte *) Bmps->ScanLine[d]; //該行像素位址給ptr for(int c = 0; c < Bmps->Width; c ) { b=ptr[c*3]; //該點第一個位子是藍色 g=ptr[c*3 1]; //該點第二個位子是綠色 r=ptr[c*3 2]; //該點第三個位子是紅色 gray=(0.299*r 0.587*g 0.114*b); if(gray>128) //如果是白色維持原來若不是變成黑色 gray=255; //0:代表black 255:代表白 else gray=0; ptr[c*3]=(Byte)gray; //存回bgr值,產生二值化影像 ptr[c*3 1]=(Byte)gray; ptr[c*3 2]=(Byte)gray; } } Form1->Image2->Picture->Bitmap=Bmps; Bmp1->Assign( Form1->Image2->Picture->Bitmap); // 將Image2 的Bitmap轉存到TBitmap Bmp for(int j = 0; j < Bmp1->Height; j ) { ptr1 = (Byte *) Bmp1->ScanLine[j]; //該行像素位址給ptr for(int i = 0; i < Bmp1->Width; i ) { if((Byte)ptr1[i*3]==0) //為何ptr[i*3]一定要這樣才可以找到圓心 ,但似乎誤差很明顯 { x_total=x_total i; //物體中心=(所有紅點X座標 / 所有紅點數, 所有紅點 Y 座標 / 所有紅點數) y_total=y_total j; x[count].x=i; //找到圖形中最後一點座標 x[count].y=j; count=count 1; } } } P1[1].x=x[0].x; //找到圖形中第一點座標 P1[1].y=x[0].y; P2[1].x=x[count].x; //找到圖形中最後一點座標 P2[1].y=x[count].y; x_center=(int)(x_total/count); //算出物體中心座標 y_center=(int)(y_total/count); r_length=sqrt(((x_center-P1[1].x)*(x_center-P1[1].x)) ((y_center-P1[1].y)*(y_center-P1[1].y))); Image2->Canvas->Pen->Color=clRed; // red color line Image2->Canvas->Pen->Width=2; Image2->Canvas->MoveTo(x_center,y_center-50);//在中心點畫 Image2->Canvas->LineTo(x_center,y_center 50); Image2->Canvas->MoveTo(x_center-50,y_center); Image2->Canvas->LineTo(x_center 50,y_center); Label2->Caption=IntToStr(x_center) "," IntToStr(y_center);//顯示物體中心座標 Label4->Caption="顯示點數:" IntToStr(count); Label3->Caption="捉到第一點座標:" IntToStr(x[0].x) "," IntToStr(x[0].y); Label5->Caption="捉到最後一點座標:" IntToStr(x[count].x) "," IntToStr(x[count].y); delete Bmp1; delete Bmps; 圖片
附加檔案:4e107e97d437b_p1.JPG
編輯記錄
eulor2000 重新編輯於 2011-07-04 08:11:06, 註解 無‧
|
diablo09105
一般會員 發表:25 回覆:45 積分:24 註冊:2011-05-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |