2011年1月11日 星期二

擷取照片_圖像二值化

上次是從最初始得把影像讀取裝置抓進來,
這次是開始拍照作以及加入了影像處理二值化,
拍照是按下擷取照片的按鈕,分別按三次將圖檔顯示在Image1、Image2、Image3,
接著按下載入圖檔按鈕將Image的圖檔載入顯示在Image4,
按下二值化按鈕後,即可對她做二值化處理並儲存起來。
(對了,二值化就是黑白照片拉~)


//程式碼開始
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "Unit1.h"
#include
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;
HWND hCapWnd;

int flag=0;
int **Data;
int **Data_temp;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{

}
//---------------------------------------------------------------------------

//連接WebCam
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int device=0;

hCapWnd=capCreateCaptureWindow (
"Capture Window",WS_CHILD | WS_VISIBLE ,
0,0,320,240,Panel1->Handle,0);

for(device=0;device<10;device++) { if(capDriverConnect(hCapWnd,device))//連結驅動程式 break; } if(device==10){ ShowMessage("No webcam device exist!"); exit(EXIT_FAILURE) ; } capOverlay(hCapWnd,true);//影像直接傳入電腦,不需要通過cpu的暫存器 capPreviewRate(hCapWnd,1000/6);//每一秒影像變化張數,數值越大,速度會越慢 capPreview(hCapWnd,true);//影像出現在視窗中 capPreviewScale(hCapWnd,true); //影像延伸到所設定的視窗大小 Timer1->Enabled=true;

}
//---------------------------------------------------------------------------
//擷取照片
void __fastcall TForm1::CaptureClick(TObject *Sender)
{
Graphics::TBitmap *bmp = new Graphics::TBitmap;
bmp->Width = Panel1->Width;
bmp->Height = Panel1->Height;
HDC hDC=GetDC(Panel1->Handle);

BitBlt(bmp->Canvas->Handle,0,0,bmp->Width,bmp->Height,hDC,0,0,0xCC0020); //SRCCOPY
ReleaseDC(Panel1->Handle , hDC);

if(flag==0){
bmp->SaveToFile("panel_1.bmp");
Image1->Picture->LoadFromFile("panel_1.bmp");//讀取bmp影像
}
if(flag==1){
bmp->SaveToFile("panel_2.bmp");
Image2->Picture->LoadFromFile("panel_2.bmp");//讀取bmp影像
}
if(flag==2){
bmp->SaveToFile("panel_3.bmp");
Image3->Picture->LoadFromFile("panel_3.bmp");//讀取bmp影像
}


delete bmp;
flag++;
if(flag==3)
flag=0;


}

//---------------------------------------------------------------------------
void __fastcall TForm1::GetBitmap(void)
{
Data = new int*[Image4->Width];
Data_temp = new int*[Image4->Width];

for(int i = 0; i < Image4->Width; i++)
{
Data[i] = new int[Image4->Height];
Data_temp[i] = new int[Image4->Height];
for(int j = 0; j < Image4->Height; j++)
Data[i][j] = Data_temp[i][j]= (Image4->Canvas->Pixels[i][j])&0xff;
}
}

void __fastcall TForm1::SetBitmap(void)
{
for(int i = 0; i < Image4->Width; i++)
for(int j = 0; j < Image4->Height; j++)
Image4->Canvas->Pixels[i][j] = TColor(RGB(Data[i][j],Data[i][j],Data[i][j]));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Retrieve(void)
{
for(int i = 0; i < Image4->Width; i++)
for(int j = 0; j < Image4->Height; j++)
Data[i][j] = Data_temp[i][j];
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button_closeClick(TObject *Sender)
{
Close();// 程式結束
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
Image4->Picture->LoadFromFile("panel_1.bmp");
Image4->Height = Image1->Height;
Image4->Width = Image1->Width;
GetBitmap();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button_2ColorClick(TObject *Sender)
{
for(int i = 0; i < Image4->Width; i++)
for(int j = 0; j < Image4->Height; j++)
{
if( Data[i][j] > 128 )
Data[i][j] = 255;
else
Data[i][j] = 0;
}
SetBitmap();
Retrieve();
}
//---------------------------------------------------------------------------
//程式碼結束

所拉的元件如下圖所式:



執行畫面如下圖所示(咦~打哪來的素顏歐巴桑~囧"~):

2011年1月10日 星期一

BCB--擷取WebCam使用

很簡單陽春的利用BCB擷取電腦USB視訊裝置,
開啟BCB後,先在Form1內放置一個Button1, 一個Timer1, 一個Panel1
接著將以下原始碼貼到Unit1.cpp
接著編譯完後,按下Button1即可看到視訊裝置畫面顯示在Panel裡面。

//原始碼開始
//---------------------------------------------------------------------------

#include
#pragma hdrstop
#include "Unit1.h"
#include
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HWND hCapWnd;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{

}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
{
// Form1->FormStyle=fsStayOnTop;//置頂
//Form1->FormStyle=fsNormal;//正常
hCapWnd=capCreateCaptureWindow (
"Capture Window",
WS_CHILD | WS_VISIBLE , // placement-order handle
0, // horizontal position
0, // vertical position
640, // width
480, // height
Panel1->Handle, // window-positioning flags
0);
capDriverConnect(hCapWnd,0);//連結驅動程式
capOverlay(hCapWnd,true);//影像直接傳入電腦,不需要通過cpu的暫存器
capPreviewRate(hCapWnd,1000/6);//每一秒影像變化張數,數值越大,速度會越慢
capPreview(hCapWnd,true);//影像出現在視窗中
capPreviewScale(hCapWnd,true);//影像延伸到所設定的視窗大小
Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
//原始碼結束


////////////////////////////////////我是分隔線=口=/////////////////////////////////////////////
附註說明:
----------------------------------------------
語法capGetDriverDescription 函數
BOOL VFWAPI capGetDriverDescription(
WORD wDriverIndex,
LPTSTR lpszName,
INT cbName,
LPTSTR lpszVer,
INT cbVer
);
參數
wDriverIndex
捕獲驅動器的索引。該索引的範圍是0~9. 隨插即用的捕獲驅動器將首先被程式枚舉,
之後是註冊表中的捕獲驅動器,再之後是位於SYSTEM.INI檔中的捕獲驅動器。

lpszName
指向一個緩衝,它包含捕獲驅動器的名字。

cbName
緩衝的大小。

lpszVer
指向一個緩衝,該緩衝包含了捕獲驅動器的相關描述。

cbVer
lpszVer緩衝的大小。
返回值
成功,返回TRUE,失敗,返回FALSE。
備註
如果描述資訊的長度大於承載它的緩衝,則該描述會被截取。如果緩衝大小為0,則不拷貝描述資訊