⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 videownd.cpp

📁 毕设终于作完了 虽然老师说行为分析做得很没意义
💻 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 + -