接着是另外一个实作,把它嵌入在OpenCV的GUI上,这边利用到cvGetWindowHandle()来做嵌入,当然,必须要用到cvNamedWindow()啦,再从cvGetWindowHandle()取得它的Handle,以下程序代码
cvcam.h使用OpenCV窗口接口播放视讯
#include <cvcam.h>
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <windows.h>
void CaptureCallback(IplImage *image);
void onMouse(int Event,int x,int y,int flags,void *param);
void onTrackbar(int position);
int TrackbarInitValue=20;
int TrackbarPosition=20;
int main()
{
cvcamGetCamerasCount();
HWND CaptureWindow;
cvNamedWindow("Webcam",0);
CaptureWindow =(HWND)cvGetWindowHandle("Webcam");
cvcamSetProperty(0,CVCAM_PROP_ENABLE,CVCAMTRUE);
cvcamSetProperty(0,CVCAM_PROP_RENDER,CVCAMTRUE);
cvcamSetProperty(0,CVCAM_PROP_WINDOW,&
CaptureWindow);
cvSetMouseCallback("Webcam",onMouse,NULL);
cvCreateTrackbar("Change","Webcam",&
TrackbarInitValue,255,onTrackbar);
cvcamSetProperty(0,CVCAM_PROP_CALLBACK,(void *)&
CaptureCallback);
cvcamInit();
cvcamStart();
cvWaitKey(0);
cvcamStop();
cvcamExit();
}
void CaptureCallback(IplImage *frame)
{
int i,j;
for(i=0;i<frame->height;i+=TrackbarPosition)
{
for(j=0;j<frame->widthStep;j+=frame->nChannels)
{
frame->imageData[i*j] =0;
frame->imageData[i*j+1]=0;
frame->imageData[i*j+2]=255;
}
}
}
void onMouse(int Event,int x,int y,int flags,void* param )
{
printf("0");
if(Event==CV_EVENT_LBUTTONDOWN)
{
cvcamPause();
printf("1");
}
else if(Event==CV_EVENT_RBUTTONDOWN)
{
cvcamResume();
printf("2");
}
}
void onTrackbar(int position)
{
TrackbarPosition=position;
}
执行结果:
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
很遗憾,OpenCV窗口程序没有提供Button的功能,要不然cvcamStart(),cvcamPause(),cvcamResume(),cvcamStop()等可以做到如Real Player播放器一样,上面的程序代码,除了把之前不必要的属性删除加入了鼠标事件及Trackbar(),鼠标事件的设计,当按左键就暂停,按右键就继续,Trackbar()则修改了for循环的规则.
cvcamPause()
暂停视讯
cvcamResume()
从暂停中重新启动
文章评论(0条评论)
登录后参与讨论