📄 facedlg.cpp
字号:
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 + -