AOI產業設備系統設計人才培育計畫夥伴學校

BUILDER C++ 中編譯第一個影像處理的程式

回上頁

在所附的影像處理的 C++BUILDER程式,讀者可以直接執行,也可以下載範例程式至硬碟,並將檔案屬性改為可讀寫,再使用 C++BUILDER 來開啟這些資料的 .MAK 檔案,您可以將其重新編譯,以求進一步利用。在此我們只挑出兩個簡單的程式,簡述其操作動作,其他的就靠讀者進入光碟後慢慢挖寶,自行體會了。

  我們也可以在BUILDER C++ 中到 FILE 下拉式功能表,選取OPEN PROJECT,然後到子目錄中開啟.MAK 檔案,或是從空白表單開始。首先介紹影像二值化與反轉的程式,影像二值化的值可根據 RGB 轉換單色輝度 Y 的運算式: Y= 0.3R+ 0.59G+0.11B,或者根據 RGB 色中任一色來作判斷。

   其實要在 BUILDER C++ 中要讓電腦展示圖形很簡單,進入 BUILDER C++ 後,系統自動建立表單 FORM1,我們只需使用滑鼠在「Standard」 選取一個物件「Button抓下來置於表單 FORM1,將名稱(CAPTION)改為 LOAD IMAGE然後用滑鼠在上面按兩下,進入 Unit1.cpp,在函式  void __fastcall TForm1::Button1Click(TObject *Sender) { 底下鍵入

if(OpenDialog1->Execute())

       {

      Image1->Picture->LoadFromFile(OpenDialog1->FileName);

       }

然後回到表單 FORM1,使用滑鼠在「Dialogs」 選取一個物件「OpenDialog」,抓下來置於表單 FORM1,再使用滑鼠在「Additional」 選取一個物件「Image」,也是抓下來置於表單 FORM1,將程式執行(按綠色箭頭按鈕)後,即可執行開檔與展示圖形的動作( 1)

程式組譯執行之畫面

我們用滑鼠抓下來置於表單 FORM1的物件「Image上面按一下,然後就可以在左邊的 properties 去設定圖形的特性,也可在 events 設定圖形的觸發事件,例如在events - OnMouseMove上面按兩下,進入 Unit1.cpp,在函式_fastcall TForm1::Image 1MouseMove(TObject *Sender, TShiftState Shift,int X, int Y) { 底下鍵入

TCColor c=Image1->Canvas->Pixels[X][Y];

     Label1->Caption=(int)c.Red;

      Label2->Caption=(int)c.Green;

       Label3->Caption=(int)c.Blue;

            Label4->Caption=X;

            Label5->Caption=Y;

其中 TCColor c 設定為圖形之 RGB 值,Label1 Label7 定為圖形之 RGB 資訊之顯示。同時我們連續七次,使用滑鼠在「Standard」 選取物件「label抓下來置於表單 FORM1,我們希望如果用滑鼠在畫面上移動,就能觀察影像RGB灰階變化以及座標位置。Label1 Label7 之字體、背景及顏色可由左邊的 properties 去設定其特性。

我們使用滑鼠在「Standard」 選取物件「Button抓下來置於表單 FORM1,將名稱(CAPTION)改為 BINARY然後用滑鼠在上面按兩下,進入 Unit1.cpp,在函式  void __fastcall TForm1::Button 2Click(TObject *Sender) { 底下鍵入

int x,y;

     for(y=1;y<=Image1->Height;y++)

 {

   for(x=1;x<=Image1->Picture->Width;x++)

   {

   TCColor c=Image1->Canvas->Pixels[x][y];

   if((int)c.Green < 100)

   {

  Image1->Canvas->Pixels[x][y]=TCColor(0, 0, 0).Color;

    }

    else

    {

  Image1->Canvas->Pixels[x][y]=TCColor(255, 255, 255).Color;

    }

    }

    }

我們使用滑鼠在「Standard」 選取物件「Button抓下來置於表單 FORM1,將名稱(CAPTION)改為 INVERSE然後用滑鼠在上面按兩下,進入 Unit1.cpp,在函式  void __fastcall TForm1::Button 2Click(TObject *Sender) { 底下鍵入

int x,y;

     for(y=1;y<=Image1->Height;y++)

 {

   for(x=1;x<=Image1->Picture->Width;x++)

   {

   TCColor c=Image1->Canvas->Pixels[x][y];

   Image1->Canvas->Pixels[x][y]=TCColor(255-(int)c.Red, 255-(int)c.Green, 255-(int)c.Blue).Color;

    }

    }

此時其畫面如圖 2 所示。

BUILDER C++ 編輯畫面

再到檔頭宣告 #include "tccolor.h",這時整個 Unit1.cpp的內容是這樣的:

//---------------------------------------------------------------------------

#include <vcl\vcl.h>

#pragma hdrstop

   #include "tccolor.h"

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

        : TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

if(OpenDialog1->Execute())

       {

      Image1->Picture->LoadFromFile(OpenDialog1->FileName);

       }

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

 int x,y;

     for(y=1;y<=Image1->Height;y++)

 {

   for(x=1;x<=Image1->Picture->Width;x++)

   {

   TCColor c=Image1->Canvas->Pixels[x][y];

   if((int)c.Green < 100)

   {

  Image1->Canvas->Pixels[x][y]=TCColor(0, 0, 0).Color;

    }

    else

    {

  Image1->Canvas->Pixels[x][y]=TCColor(255, 255, 255).Color;

    }

    }

    }

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,

        int X, int Y)

{

TCColor c=Image1->Canvas->Pixels[X][Y];

     Label1->Caption=(int)c.Red;

      Label2->Caption=(int)c.Green;

       Label3->Caption=(int)c.Blue;

            Label4->Caption=X;

            Label5->Caption=Y;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)

{

 int x,y;

     for(y=1;y<=Image1->Height;y++)

 {

   for(x=1;x<=Image1->Picture->Width;x++)

   {

   TCColor c=Image1->Canvas->Pixels[x][y];

   Image1->Canvas->Pixels[x][y]=TCColor(255-(int)c.Red, 255-(int)c.Green, 255-(int)c.Blue).Color;

    }

    }

}

//---------------------------------------------------------------------------

我們只要將程式加以組譯執行,就可以看到畫面如圖 3 所示:

程式組譯執行之畫面

這時候如果用滑鼠在畫面上移動,就能觀察影像RGB灰階變化以及座標位置,如果用滑鼠按下 binary 的按鈕,就可以看到影像變為黑白兩色(圖 4)。

用滑鼠按下 binary 的按鈕執行之畫面

如果再用滑鼠按下 inverse 的按鈕,就可以看到影像黑變為白、白變為黑兩色互換的結果(圖 5)。

用滑鼠按下 inverse 的按鈕執行之畫面

原程式碼及其說明,讀者可自行下載研究,別忘了將檔案屬性改為可讀寫,再使用 C++BUILDER 來開啟子目錄的 PROJECT1.MAK 檔案,您可以將其重新編譯,以求進一步利用。測試用影像檔案檔名為bluesky.bmp

回上頁