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

📄 facedlg.cpp

📁 基于Opencv与VC环境的视频采集图像滤波与角点检测运动跟踪
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	rgb[sector_data[sector][0]]=255;
	rgb[sector_data[sector][1]]=0;
	rgb[sector_data[sector][2]]=p;	
	return cvScalar(rgb[2],rgb[1],rgb[0],0);
}

void CFaceDlg::OnObjectTrack() 
{
	// TODO: Add your control notification handler code here
	int i,bin_w,c;
	CvCapture* capture=NULL;
	IplImage* frame=NULL;
	CvPoint2D32f xy_center0;
	CvPoint  xy_centint0,xy_centint,xy_centint1[300];
	int pFrameNum=0;


	CString sm_filename; 
	CFileDialog   dlg(true);
	
	xy_centint0.x=0;xy_centint0.y=0;
    xy_centint=xy_centint0;
	cvNamedWindow("Histogram",1);
	cvNamedWindow("CamShiftDemo",1);
	cvSetMouseCallback("CamShiftDemo",On_Mouse,NULL);  //on_mouse自定义事件
	cvCreateTrackbar("Vmin","CamShiftDemo",&vmin,256,0);
	cvCreateTrackbar("Vmax","CamShiftDemo",&vmax,256,0);
	cvCreateTrackbar("Smin","CamShiftDemo",&smin,256,0);
	
/*	dlg.DoModal();
	sm_filename = dlg.GetPathName();
	if(sm_filename=="") return;
	capture=cvCaptureFromAVI(sm_filename);//从文件中读取视频*/
	capture = cvCaptureFromCAM(0); //从摄像头上采集数据

	while(frame=cvQueryFrame(capture))
	{
		//if(cvWaitKey(0)) break;
		if(!image)
		{
		/*是第一侦分配存储空间*/
			image=cvCreateImage(cvGetSize(frame),8,3);
			image->origin=frame->origin;
			hsv=cvCreateImage(cvGetSize(frame),8,3);
			hue=cvCreateImage(cvGetSize(frame),8,1);
			mask=cvCreateImage(cvGetSize(frame),8,1);
			backproject=cvCreateImage(cvGetSize(frame),8,1);
			hist=cvCreateHist(1,&hdims,CV_HIST_ARRAY,&hranges,1);   //计算直方图
			histimg=cvCreateImage(cvSize(320,200),8,3);
			cvZero(histimg);
		}

		cvCopy(frame,image,0);
		cvCvtColor(image,hsv,CV_BGR2HSV);//从彩色空间转换到HSV

		if(track_object)
		{
			int _vmin=vmin,_vmax=vmax;
			cvInRangeS(hsv,cvScalar(0,smin,MIN(_vmin,_vmax),0),
				cvScalar(180,256,MAX(_vmin,_vmax),0),mask);//得到二值掩码
			cvSplit(hsv,hue,0,0,0); //只提取HUE分量
			if(track_object<0)
			{
				float max_val=0.f;
				cvSetImageROI(hue,selection); //将选择区域设置为ROI
				cvSetImageROI(mask,selection); //将选择区域设置为ROI
				cvCalcHist(&hue,hist,0,mask);//计算直方图
				cvGetMinMaxHistValue(hist,0,&max_val,0,0);//只找最大值
				//缩放bin到[0,255]
				cvConvertScale(hist->bins,hist->bins,max_val?255./max_val:0.,0);
				cvResetImageROI(hue);//remove ROI
				cvResetImageROI(mask);
				track_window=selection;
				track_object=1;
				cvZero(histimg);
				bin_w=histimg->width/hdims;//hdims为条的个数,则bin_w为条的宽度
			
			//画直方图
				for(i=0;i<hdims;i++)
				{
					int val=cvRound(cvGetReal1D(hist->bins,i)*histimg->height/255);
					CvScalar color=hsv2rgb(i*180.f/hdims);
					cvRectangle(histimg,cvPoint(i*bin_w,histimg->height),
					cvPoint((i+1)*bin_w,histimg->height-val),color,1,8,0);
				}
			}		
			cvCalcBackProject(&hue,backproject,hist);//使用back project方法
			cvAnd(backproject,mask,backproject,0);

			//调用Camshift算法模块
			cvCamShift(backproject,track_window,cvTermCriteria(CV_TERMCRIT_EPS|
				CV_TERMCRIT_ITER,10,1),&track_comp,&track_box);
			track_window=track_comp.rect;
			if(backproject_mode)		
				cvCvtColor(backproject,image,CV_GRAY2BGR);//使用灰度图像
			if(image->origin)
				track_box.angle=-track_box.angle;
			xy_center0=track_box.center;   //目标中心位置
			int x_center=(int)track_box.center.x;//取中心的x坐标
			int y_center=(int)track_box.center.y;			
			xy_centint0.x=x_center; xy_centint0.y=y_center; 			
			if(pFrameNum>299)pFrameNum=0;
			xy_centint1[pFrameNum++]=xy_centint0;

			//cvLine(image,xy_centint0,xy_centint,CV_RGB(255,0,0),2,CV_AA,3);

			cvEllipseBox(image,track_box,CV_RGB(255,0,0),2,CV_AA,0);
			xy_centint=xy_centint0; //保存上侦一数据

		}
		if(select_object&&selection.width>0&&selection.height>0)
		{
			cvSetImageROI(image,selection);
			cvXorS(image,cvScalarAll(255),image,0);
			cvResetImageROI(image);
		}

		cvShowImage("CamShiftDemo",image);
		cvShowImage("Histogram",histimg);

		c=cvWaitKey(10);
		if(c==27)
			break;
		switch(c)
		{
			case'b':
				backproject_mode^=1;
				break;
			case'c':
				track_object=0;
				cvZero(histimg);
				break;
			case't':
				track_object=0;
				cvZero(histimg);
				cvReleaseCapture(&capture);
				cvDestroyWindow("CamShiftDemo");
				break;
			case'h':
				show_hist^=1;
				if(!show_hist)
					cvDestroyWindow("Histogram");
				else
					cvNamedWindow("Histogram",1);
				break;
			default:
				;
		}
	}
	
//	for(i=0;i<pFrameNum;i++)//划线暂时还没有成功
//		cvLine(image,xy_centint1[i],xy_centint1[i+1],CV_RGB(255,0,0),2,CV_AA,3);	
//	cvWaitKey(0);
	cvReleaseCapture(&capture);
	cvDestroyWindow("CamShiftDemo");
}

void CFaceDlg::OnHistImg() 
{
	// TODO: Add your control notification handler code here
	IplImage *src=NULL;
	//CvHistogram *hist=NULL;
	//int hdims=50;//划分直方图的个数,越高越精细
	float hranges_arr[]={0,255};
	float *hranges=hranges_arr;
	int bin_w,i;
	float max_val;	
	CString sm_filename; 
	CFileDialog   dlg(true);

	hdims=50;
	dlg.DoModal();
	sm_filename = dlg.GetPathName();
	if(sm_filename=="") return;
	src=cvLoadImage(sm_filename,0);//以灰度图方式读入图像

	cvNamedWindow("Histogram",0);
	cvNamedWindow("src",0);


	hist=cvCreateHist(1,&hdims,CV_HIST_ARRAY,&hranges,1);   //计算直方图
	histimg=cvCreateImage(cvSize(320,200),8,3);
	cvZero(histimg);
	cvCalcHist(&src,hist,0,0);//计算直方图
	cvGetMinMaxHistValue(hist,0,&max_val,0,0);//只找最大值
	cvConvertScale(hist->bins,hist->bins,max_val ?255./max_val:0.,0);//缩放bin 到区间[0,255]
	cvZero(histimg);
	bin_w=histimg->width/hdims;//bin_w为直方块的宽度
	//画直方图
	for(i=0;i<hdims;i++)
	{	
		int val=cvRound(cvGetReal1D(hist->bins,i)*histimg->height/255);
		CvScalar color=CV_RGB(255,255,0);//
		cvRectangle(histimg,cvPoint(i*bin_w,histimg->height),
		cvPoint((i+1)*bin_w,histimg->height-val),color,1,8,0);
		
	}
	cvShowImage("src",src);
	cvShowImage("Histogram",histimg);
	cvWaitKey(0);
	cvDestroyWindow("src");
	cvDestroyWindow("Histogram");
	cvReleaseImage(&src);
	cvReleaseImage(&histimg);
	cvReleaseHist(&hist);
}

void CFaceDlg::OnWriterVideo() 
{
	// TODO: Add your control notification handler code here
	CvCapture* pCapture = NULL; 
	IplImage *img=NULL;
	int nFrames=100;
	//使用下列语句对视频写入进行初始化
	CvVideoWriter *writer=0;
	int isColor=1;
	int fps=12;
	int frameW=320,frameH=240;
	cvNamedWindow("video", 1); 
	pCapture = cvCaptureFromCAM(0); //从摄像头上采集数据

	writer=cvCreateVideoWriter("out1.avi",CV_FOURCC('P','I','M','1'),fps,cvSize(frameW,frameH),isColor);
	for(int i=0;i<nFrames;i++)
	{
	   cvGrabFrame(pCapture); //capture a frame
       img=cvRetrieveFrame(pCapture);//retrieve the capture frame
	   cvWriteFrame(writer,img);//add the frame to the file
	   cvShowImage("video",img);
	   cvWaitKey(20);
	}
	cvReleaseVideoWriter(&writer);
	
}
void callback(IplImage* image)
{
	IplImage* image1 = image;
    int i,j;
	CvFont font;
	double hScale=1.0,vScale=1.0,t=0;
	int lineWidth=1;
	cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC,hScale,vScale,0,lineWidth);
    
    assert (image);
    cvPutText(image,"my first word",cvPoint(10,200),&font,cvScalar(0,0,255));//添加字符到图像上	
    
	for(i=0; i<image1->height; i+=10)
    {
        for(j=(image1->widthStep)*i; j<(image1->widthStep)*(i+1); j+=image1->nChannels)
        {
          //  image1->imageData[j]   = (char)255;
          //  image1->imageData[j+1] = 0;
          //  image1->imageData[j+2] = 0;
        } 
     }
}

void CFaceDlg::OnCapture() 
{
	// TODO: Add your control notification handler code here
	int ncams=cvcamGetCamerasCount();//返回可以访问的摄像头数目
	HWND MyWin;
	//设置系统属性
	cvcamSetProperty(0,CVCAM_PROP_ENABLE,CVCAMTRUE);//选择第一个摄像头
	//camera
	cvcamSetProperty(0,CVCAM_PROP_RENDER,CVCAMTRUE);//we'll render stream
	//本例中,假设创建一个窗口,且窗口ID在变量MyWin中定义,MyWin是窗口HWND类型
	MyWin=(HWND)cvGetWindowHandle("cvcam window");
	cvcamSetProperty(0,CVCAM_PROP_WINDOW,&MyWin);//Select a window for video rendering
	//回调函数将处理每一帧
	cvcamSetProperty(0,CVCAM_PROP_CALLBACK,callback);//调用回调函数callback
	cvcamInit();
	cvcamStart();
	//现在程序开始工作
	cvWaitKey(0);
	cvcamStop();
	cvcamExit();	
	//cvcamPlayAVI(0,0,0,0,0);
	
}


void CFaceDlg::OnCornerDetect() 
{
	// TODO: Add your control notification handler code here
	CString sm_filename; 
	CFileDialog   dlg(true);
	int cornerCount=max_corners;
    CvPoint2D32f corners[max_corners];
    IplImage *srcImage = 0, *grayImage = 0, *corners1 = 0, *corners2 = 0;
    int i;
    CvScalar color = CV_RGB(255,0,0);

	dlg.DoModal();
	sm_filename = dlg.GetPathName();
	if(sm_filename=="") return;
	srcImage=cvLoadImage(sm_filename,0);//以灰度图方式读入图像
    
    cvNamedWindow( "image", 1 ); // create HighGUI window with name "image"
    
    //Load the image to be processed
    srcImage = cvLoadImage(sm_filename, 1);
    
    grayImage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1);
    
    //copy the source image to copy image after converting the format
    cvCvtColor(srcImage, grayImage, CV_BGR2GRAY);
    
    //create empty images of same size as the copied images
    corners1= cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_32F, 1);
    corners2= cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_32F, 1);
    
    cvGoodFeaturesToTrack (grayImage, corners1, 
        corners2, corners,
        &cornerCount, 0.05,
        5, 
        0,
        3,  // block size
        0,  // not use harris
        0.4 );
    
    //printf("num corners found: %d\n", cornerCount); 
    //cornerCount表示角点个数
    // draw circles at each corner location in the gray image and
    //print out a list the corners 
    if(cornerCount>0) 
    {
        for (i=0; i<cornerCount; i++) 
        {
            cvCircle(srcImage, cvPoint((int)(corners[i].x), (int)(corners[i].y)), 6,
                color, 2, CV_AA, 0);
        }
    }
    
    cvShowImage( "image", srcImage ); 
    
    cvReleaseImage(&srcImage);
    cvReleaseImage(&grayImage);
    cvReleaseImage(&corners1);
    cvReleaseImage(&corners2);
    
    cvWaitKey(0); // wait for key. The function has
	
}
//对图像进行滤波
void CFaceDlg::OnFilterImage() 
{
	// TODO: Add your control notification handler code here
	CString sm_filename; 
	CFileDialog   dlg(true);

	IplImage *src = 0, *dst = 0, *dst2 = 0;
    /*float k[9] = { 0, 1, 0,
                   1,-4, 1,
                   0, 1, 0}; */
    float k[9] = { 1.f/16, 2.f/16, 1.f/16,
                   2.f/16, 4.f/16, 2.f/16,
                   1.f/16, 2.f/16, 1.f/16};   // 这里高斯核滤波器归一化
    CvMat Km;
    //cvInitMatHeader( &Km, 3, 3, CV_32FC1, k, CV_AUTOSTEP );
    Km = cvMat( 3, 3, CV_32F, k );

    // 0:  force to gray image
	dlg.DoModal();
	sm_filename = dlg.GetPathName();
	if(sm_filename=="") return;
	src=cvLoadImage(sm_filename,0);//以灰度图方式读入图像
	//src = cvLoadImage("lena.jpg", 0);
    dst = cvCloneImage( src );

    cvNamedWindow("src", 0);
    cvShowImage("src",src);
    
    cvNamedWindow("filtering", 0);
    cvFilter2D( src, dst, &Km, cvPoint(-1,-1));
    cvShowImage("filtering",dst);
    cvWaitKey(0);

    cvReleaseImage( &src );
    cvReleaseImage( &dst );
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -