請大家救救我吧!我寫了一個多執行緒的程式,用來判斷影像是否有移動,只要移動就會錄影
不動就停止錄影,但是一但錄影的時候,就不能動作,不能比較圖片,請大家救救我吧 //--------------------------------------------------------------------------- #include
#pragma hdrstop #include "Unit1.h"
#include "vfw.h"
#include "jpeg.hpp"
#include
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HWND hCapWnd;
BITMAPINFO bmi;
CAPTUREPARMS CaptureParms;
int width,height,ss,mm,hh,dd;
bool flag;
double compare;
static double basic;
static int cout;
TMyThread *MyThread,*MyThread1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
width=320;
height=240;
hCapWnd = capCreateCaptureWindow("My Capture Window", WS_CHILD | WS_VISIBLE,0, 0, width, height,Form1->Panel1->Handle, 0 );
bool a = false;
for( int i = 0; i < 10; i )
{
a = capDriverConnect( hCapWnd, i );
if( a ) break;
}
if( !a )
{
ShowMessage("攝影機連接失敗..");
}
capOverlay(hCapWnd, true);
capPreview(hCapWnd,true);
capPreviewScale(hCapWnd,true);
capPreviewRate(hCapWnd, 1000/30);
capGetVideoFormat(hCapWnd, &bmi, sizeof(BITMAPINFO));
bmi.bmiHeader.biWidth=width;
bmi.bmiHeader.biHeight=height;
SetWindowPos(hCapWnd, 0, 0, 0, bmi.bmiHeader.biWidth,bmi.bmiHeader.biHeight,0);
Form1->Panel1->ClientHeight=bmi.bmiHeader.biHeight;
Form1->Panel1->ClientWidth=bmi.bmiHeader.biWidth;
basic=0;
compare=0;
flag=false;
}
//---------------------------------------------------------------------------
_fastcall TMyThread::TMyThread(void):TThread(true)
{
Resume();
} void __fastcall TMyThread::Execute()//執行緒 function
{ } void __fastcall TMyThread::wwb3()
{
Synchronize(wwb);
} void __fastcall TMyThread::wwb2()
{
Synchronize(wwb1);
} void __fastcall TMyThread::wwb1()
{
capGrabFrameNoStop(hCapWnd);
capEditCopy(hCapWnd);
if(Clipboard()->HasFormat(CF_BITMAP))
{
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
Byte *ptr1;
int r,g,b;
int gray;
int i,j;
int threshold;
threshold=125;
Form1->img1->Picture->Bitmap->Assign(Clipboard());
Bmp->Assign(Form1->img1->Picture->Bitmap);
for(j=0;jHeight;j )
{
ptr1 = (Byte *)Bmp->ScanLine[j];
for(i=0;iWidth;i )
{
b=ptr1[i*3];
g=ptr1[i*3 1];
r=ptr1[i*3 2];
gray=0.299*r 0.587*g 0.114*b;
if(gray>threshold)
gray=255;
else
gray=0;
compare=compare gray;
}
}
}
} void __fastcall TMyThread::wwb()
{ if (basic==0)
basic=compare;
if ((abs(compare-basic)>=200000) && (flag==false))
{//Form1->Btn1->Click();
basic=compare;
compare=0;
flag=true;
Form1->Memo1->Lines->Add("開始錄影"); }
else if ((abs(compare-basic)<=200000) && (flag==true))
{if(cout==5)
{
//Form1->Btn1->Click();
Form1->Memo1->Lines->Add("停止");
basic=compare;
compare=0;
flag=false;
cout=0;
}
else
{
cout=cout 1;
basic=compare;
compare=0;
}
}
else
{basic=compare;
compare=0;
cout=0;
Form1->Memo1->Lines->Add("繼續");}
} void __fastcall TForm1::Btn2Click(TObject *Sender)
{
capDriverDisconnect(hCapWnd);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Btn1Click(TObject *Sender)
{
if(Btn1->Caption=="啟動錄影")
{
SaveDialog1->InitialDir=ExtractFilePath(Application->ExeName);
SaveDialog1->FileName=Now().FormatString("yyyymmmmddhhnnss");
capCaptureGetSetup(hCapWnd,&CaptureParms,sizeof(CAPTUREPARMS));
CaptureParms.fYield = true;
CaptureParms.vKeyAbort = VK_F1;
CaptureParms.fAbortLeftMouse = false;
CaptureParms.fAbortRightMouse = false;
CaptureParms.dwIndexSize = 324000;
capCaptureSetSetup(hCapWnd,&CaptureParms,sizeof(CAPTUREPARMS));
capFileSetCaptureFile(hCapWnd,(SaveDialog1->FileName ".avi").c_str());
capCaptureSequence(hCapWnd);
Btn1->Caption="停止錄影";
}
else
{
capCaptureStop(hCapWnd);
Btn1->Caption="啟動錄影";
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
if(Btn1->Caption=="啟動錄影")
{
Form1->Caption="攝影機--現在時間: " Time();
ss=0;dd=0;mm=0;hh=0;
}
if(Btn1->Caption=="停止錄影")
{
if(ss==60)
{
ss=0;
mm ;
}
if(mm==60)
{
mm=0;
hh ;
}
if(hh==24)
{
hh=0;
dd ;
}
Form1->Caption="攝影機--錄影中: " IntToStr(dd) " 天" IntToStr(hh) " 時" IntToStr(mm) " 分" IntToStr(ss) " 秒";
ss ;
}
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
MyThread=new TMyThread();
MyThread->Priority = tpNormal;
MyThread->FreeOnTerminate=true; MyThread1=new TMyThread();
MyThread1->Priority = tpHighest;
MyThread1->FreeOnTerminate=true; MyThread1->wwb2();
MyThread->wwb3();
}
//--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
MyThread->Terminate();
MyThread1->Terminate();
}
//---------------------------------------------------------------------------