📄 videownd.cpp
字号:
// VideoWnd.cpp: implementation of the CVideoWnd class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "PfTrack.h"
#include "VideoWnd.h"
#include "cv.h"
#include "highgui.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IplImage *image = 0, *HSV=0;
/*
CvHistogram *hist = 0;
IplImage *hsv = 0, *hue = 0, *mask = 0, *backproject = 0, *histimg = 0;
int backproject_mode = 0;
int select_object = 0;
int track_object = 0;
int show_hist = 1;
CvRect selection;
CvRect track_window;
CvBox2D track_box;
CvConnectedComp track_comp;
int hdims = 16;
float hranges_arr[] = {0,180};
float* hranges = hranges_arr;
int vmin = 10, vmax = 256, smin = 30;
CvPoint origin;
*/
//////////
///////////
CVideoWnd::CVideoWnd()
{
count=0;
state=0;
capture=0;
getcountj=0;
}
CVideoWnd::~CVideoWnd()
{
//释放相应资源
cvReleaseImage(&image);
cvReleaseImage(&HSV);
cvReleaseConDensation(&ConDens);
cvReleaseMat( &lowerBound );
cvReleaseMat( &upperBound );
cvReleaseCapture( &capture );
}
BEGIN_MESSAGE_MAP(CVideoWnd, CStatic)
//{{AFX_MSG_MAP(CVideoWnd)
ON_WM_PAINT()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CVideoWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
//初始化时画背景
if(state==0)
DrawBackGround();
else
{
CvvImage PreviewImage;
RECT previewWnd;
//获取窗口客户区域的坐标。客户区坐标指定客户区的左上角和右下角。由于客户区坐标是相对子窗口客户区的左上角而言的,因此左上角坐标为(0,0)
GetClientRect(&previewWnd);
PreviewImage.CopyOf(source,-1);
PreviewImage.DrawToHDC(dc.m_hDC,&previewWnd);
}
// TODO: Add your message handler code here
// Do not call CStatic::OnPaint() for painting messages
}
void CVideoWnd::DrawBackGround()
{
CDC *dc;
dc=GetDC();
CDC dcMem;
dcMem.CreateCompatibleDC(dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BACKGROUND);
BITMAP bitMap;
bmpBackground.GetBitmap(&bitMap);
CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
dc->StretchBlt(0,0,bitMap.bmWidth,bitMap.bmHeight,&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);//???
ReleaseDC(dc);
dcMem.SelectObject(pbmpOld);
ReleaseDC(&dcMem);
}
void CVideoWnd::VideoCatch()
{
if(!capture)
{
//获取摄像头
capture = cvCaptureFromCAM(-1);
//错误警告
if( !capture )
{
::AfxMessageBox("没有找到摄像头");
return;
}
state=1;
SetTimer(1,10,NULL);
}
}
void CVideoWnd::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(!capture)
return;
CDC *pDC=GetDC();
//获取一桢图像
source = cvQueryFrame( capture );
if(source)
{
switch(state)
{
case 1 :
break;
case 2:
{
PFTrack();
count++;
break;
}
case 3:
{
DrawPath();
break;
}
case 4:
{
ShowAnalysis();
break;
}
// break;
default: break;
}
CvvImage PreviewImage;
//获取对话框的大小
RECT previewWnd;
GetClientRect(&previewWnd);
PreviewImage.CopyOf(source,-1);
PreviewImage.DrawToHDC(pDC->m_hDC,&previewWnd);
CStatic::OnTimer(nIDEvent);
}
}
void CVideoWnd::PFTrack()
{
//condensation
BOOL get=false;
IplImage* frame = 0;
//////////////////
int sumx=0;
int sumy=0;
int start=0;//计算置信点个数当大于等于10时认为找到目标
/////////////////////
int X,Y;
int H,S,V;
// frame = cvQueryFrame( capture );
frame=source;
if( !image ){
image = cvCreateImage( cvGetSize(frame), 8, 3 );
image->origin = frame->origin;
HSV = cvCreateImage( cvGetSize(frame), 8, 3 );
HSV->origin = frame->origin;
}
cvCopy( frame, image, 0 );
cvCvtColor(image ,HSV , CV_BGR2HSV);
for(int i=0; i < SamplesNum; i++){
X=(int)ConDens->flSamples[i][0];
Y=(int)ConDens->flSamples[i][1];
sumx=sumx+X;
sumy=sumy+Y;
////////////////
/*
test[i][0]=X;
test[i][1]=Y;
str[i][0].Format("%d",test[i][0]);
result+=str[i][0];
result+=' ';
str[i][1].Format("%d",test[i][1]);
result+=str[i][1];
result+='/';
*/
/////////////////////////
if(X>=0 && X<=320 && Y>=0 && Y<=240){ //320 240
getpixel(HSV, X, Y, &H, &S, &V);
if(H<=19 && S>=48){
ConDens->flConfidence[i]=1.0;\
start++;
//XX=X;
// YY=Y;
if (start>=10)
{
get=true;
}
cvCircle(image, cvPoint(X,Y), 30, CV_RGB(255,123,255), 0.5);
// test[i][0]=ConDens->flConfidence[i];
// str[i][0].Format("%d",test[i][0]);
// result+=str[i][0];
// result+=' ';
// ConDens->flConfidence[i]=1.0;
}
else{
ConDens->flConfidence[i]=0.0;
}
}
else{
// cvCircle(image, cvPoint(XX,YY), 4, CV_RGB(255,123,255), 2);
ConDens->flConfidence[i]=0.0;
}
}
//找出中值 先用平均值
XX=sumx/SamplesNum;
YY=sumy/SamplesNum;
///////////////////////
//再用中值对比效果?
//因为这样要加大运算量,暂不考虑
///////////////////
CvPoint pt1,pt2;
pt1.x=XX-40;
pt1.y=YY-40;
pt2.x=XX+30;
pt2.y=YY+30;
if (get)
{
getcount=count-getcountj;
getcountj++;
cvRectangle(image,pt1,pt2,CV_RGB(0,0,255),1,8,0);
}
cvRectangle(image,pt1,pt2,CV_RGB(0,0,255),1,8,0);
//////////////////////////
center[count][0]=XX;
center[count][1]=YY;
cvConDensUpdateByTime(ConDens);
source=image;
}
int CVideoWnd::getpixel(IplImage *image, int x, int y, int *h, int *s, int *v)
{
*h =(uchar) image->imageData[y *image->widthStep+x * image->nChannels];
*s =(uchar) image->imageData[y *image->widthStep+ x * image->nChannels + 1];
*v =(uchar) image->imageData[y *image->widthStep+ x * image->nChannels + 2];
return 0;
}
void CVideoWnd::DrawPath()
{
}
void CVideoWnd::ShowAnalysis()
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -