📄 cvvideo.cpp
字号:
int k;
CvVideoCamera *const camera = &(cameras[cameraid]);
#ifdef DEBUG_CVCAM
printf("cvcamSetProperty(camera=%d,property=%s)\n",cameraid, property);
#endif
if(!cameras||cameraid>ncameras-1||cameraid<0)
{
fprintf(stderr,"cvcamSetProperty: no such camera\n");
return 0;
}//if(!cameras||camera>ncameras-1)
IF_SETTING_PROPERTY("description")
{
fprintf(stdout, "cvcamSetProperty: The property \"description\" cannot be "
"set\n");
return 0;
}//IF_SETTING_PROPERTY("description")
IF_SETTING_PROPERTY("enable")
{
camera->enabled = (int)value;
return 1;
}//IF_SETTING_PROPERTY("enable")
IF_SETTING_PROPERTY("render")
{
camera->rendered = (int)value;
return 1;
}//IF_SETTING_PROPERTY("render")
IF_SETTING_PROPERTY("window")
{
camera->window = *(Window*)value;
//fprintf(stdout,"TODO get prop window\n");
return 1;
}//IF_SETTING_PROPERTY("window")
IF_SETTING_PROPERTY("callback")
{
camera->callback = ( void (*)(IplImage*) )value;
return 1;
}//IF_SETTING_PROPERTY("callback")
IF_SETTING_PROPERTY("camera_pp")
{
fprintf(stdout,"TODO get prop camera_pp\n");
return 1;
}//IF_SETTING_PROPERTY("camera_pp")
IF_SETTING_PROPERTY("description")
{
fprintf(stdout,"TODO get prop camera_pp\n");
return 1;
}//IF_SETTING_PROPERTY("camera_pp")
IF_SETTING_PROPERTY("set_video_format")
{
k = icvVideoStop(cameraid);
if(
(((VideoFormat*)value)->picture.brightness>0xffff)||
(((VideoFormat*)value)->picture.hue>0xffff)||
(((VideoFormat*)value)->picture.colour>0xffff)||
(((VideoFormat*)value)->picture.contrast>0xffff)||
(((VideoFormat*)value)->picture.whiteness>0xffff)||
(((VideoFormat*)value)->width > camera->description.maxwidth)||
(((VideoFormat*)value)->height > camera->description.maxheight)||
(((VideoFormat*)value)->width < camera->description.minwidth)||
(((VideoFormat*)value)->height < camera->description.minheight)
)
{
#ifdef DEBUG_CVCAM
printf("cvcamSetProperty(camera=%d,property=%s): values out of bounds\n",cameraid, property);
#endif
if(k)
icvVideoStart(cameraid);
return 0;
}
if(
((((VideoFormat*)value)->width == camera->description.maxwidth)&&
(((VideoFormat*)value)->height == camera->description.maxheight))||
((((VideoFormat*)value)->width == camera->description.minwidth)&&
(((VideoFormat*)value)->height == camera->description.minheight))||
((((VideoFormat*)value)->width == 320)&&
(((VideoFormat*)value)->height == 240))
)
{
camera->videopp.width = ((VideoFormat*)value)->width;
camera->videopp.height= ((VideoFormat*)value)->height;
}
else
{
if(
((((VideoFormat*)value)->width > 320)&&
((VideoFormat*)value)->height > 240)
)
{
camera->videopp.width = 320;
camera->videopp.height= 240;
}else
{
camera->videopp.width=
camera->description.minwidth;
camera->videopp.height=
camera->description.minheight;
}
}
camera->videopp.picture.brightness=
((VideoFormat*)value)->picture.brightness;
camera->videopp.picture.hue=
((VideoFormat*)value)->picture.hue;
camera->videopp.picture.colour=
((VideoFormat*)value)->picture.colour;
camera->videopp.picture.contrast=
((VideoFormat*)value)->picture.contrast ;
camera->videopp.picture.whiteness=
((VideoFormat*)value)->picture.whiteness;
camera->videopp.picture.palette=
((VideoFormat*)value)->picture.palette;
if(camera->videopp.picture.palette == VIDEO_PALETTE_YUV420P)
camera->imagepalette = VIDEO_PALETTE_RGB24;
camera->videopp.picture.depth = icvVideoFormat2Depth(camera->imagepalette);
if(!camera->videopp.picture.depth)
return 0;
//cvcamInit();
if(k)
icvVideoStart(cameraid);
//fprintf(stdout,"TODO get prop video_pp\n");
return 1;
}//IF_SETTING_PROPERTY("set_video_format")
IF_SETTING_PROPERTY("rectify_parameters")
{
fprintf(stdout,"TODO get prop rectify_parameters\n");
return 1;
}//IF_SETTING_PROPERTY("rectify_parameters")
IF_SETTING_PROPERTY("stereo_parameters")
{
fprintf(stdout,"TODO get prop stereo_parameters\n");
return 1;
}//IF_SETTING_PROPERTY("stereo_parameters")
IF_SETTING_PROPERTY("raw_image")
{
fprintf(stdout,"TODO get prop raw_image\n");
return 1;
}//IF_SETTING_PROPERTY("raw_image")
IF_SETTING_PROPERTY("disparity")
{
fprintf(stdout,"TODO get prop disparity\n");
return 1;
}//IF_SETTING_PROPERTY("disparity")
IF_SETTING_PROPERTY("stereo_image")
{
fprintf(stdout,"TODO get prop stereo_image\n");
return 1;
}//IF_SETTING_PROPERTY("stereo_image")
IF_SETTING_PROPERTY("video_pp")
{
fprintf(stdout,"TODO get prop set_video_format\n");
return 1;
}//IF_SETTING_PROPERTY( "video_pp" )
IF_SETTING_PROPERTY(CVCAM_RNDWIDTH)
{
k=icvVideoStop(cameraid);
camera->renderwidth = *(int*)value;
if(k)
icvVideoStart(cameraid);
return 1;
}//IF_SETTING_PROPERTY(CVCAM_RNDWIDTH)
IF_SETTING_PROPERTY(CVCAM_RNDHEIGHT)
{
k=icvVideoStop(cameraid);
camera->renderheight = *(int*)value;
if(k)
icvVideoStart(cameraid);
return 1;
}//IF_SETTING_PROPERTY(CVCAM_RNDHEIGHT)
return 0;
}
///////////////////////////////////////////////////////////////////////////////
/* Prepares the currently enabled cameras for work */
int cvcamInit()
{
int camera;
#ifdef DEBUG_CVCAM
printf("cvcamInit()\n");
#endif
for(camera=0; camera<ncameras; camera++)
{
icvVideoInit(camera);
}//for(camera=0; camera<ncameras; camera++)
return 1;
}
///////////////////////////////////////////////////////////////////////////////
/* Start the video */
int cvcamStart()
{
int cameraid;
#ifdef DEBUG_CVCAM
printf("cvcamStart()\n");
#endif
for(cameraid=0; cameraid<ncameras; cameraid++)
{
if(cameras[cameraid].enabled)
{
if(!icvVideoStart(cameraid))
{
return 0;
}
}
}//for(cameraid=0; cameraid<ncameras; cameraid++)
return 1;
}
int icvVideoStart(int cameraid)
{
CvVideoCamera *const camera = &(cameras[cameraid]);
int frame;
pthread_mutex_lock(&(camera->capturestatemutex));
if(camera->capturestate != READY)
{
fprintf(stderr,"icvVideoStart: camera %d not ready\n",camera);
pthread_mutex_unlock(&(camera->capturestatemutex));
return 0;
}
camera->capturestate = STARTING;
pthread_cond_signal(&(camera->capturestatecond));
pthread_mutex_unlock(&(camera->capturestatemutex));
pthread_mutex_lock(&(camera->ioctlmutex));
if(ioctl(camera->device, VIDIOCGMBUF,
&(camera->mbuf)) == -1)
{
pthread_mutex_unlock(&(camera->ioctlmutex));
return 0;
}
pthread_mutex_unlock(&(camera->ioctlmutex));
#ifdef DEBUG_CVCAM
printf("mbuf: size=%d, frames=%d, offsets=",camera->mbuf.size,
camera->mbuf.frames);
#endif
camera->memorymap = (char*)mmap(0,
camera->mbuf.size,
PROT_READ|PROT_WRITE, MAP_SHARED,
camera->device,
0);
if((int)camera->memorymap == -1)
{
fprintf(stderr, "icvVideoStart: mmap failed");
return 0;
}
// acquire first frame
camera->vid_mmap.frame = 0;
camera->vid_mmap.width = camera->videopp.width;
camera->vid_mmap.height = camera->videopp.height;
camera->vid_mmap.format = camera->videopp.picture.palette;
camera->lastframe = 0;
pthread_mutex_lock(&(camera->ioctlmutex));
if(ioctl(camera->device, VIDIOCMCAPTURE, &(camera->vid_mmap)) < 0)
{
fprintf(stderr, "icvVideoInit: ioctl VIDIOCMCAPTURE failed \n");
return 0;
}
if(ioctl(camera->device, VIDIOCSYNC, &(camera->vid_mmap.frame) ) < 0)
{
fprintf(stderr, "icvVideoInit: ioctl VIDIOCSYNC failed \n");
return 0;
}//if ioctl(..., VIDIOCSYNK, ...)
pthread_mutex_unlock(&(camera->ioctlmutex));
assert(camera->videopp.picture.palette);
assert(icvVideoFormat2Depth(camera->imagepalette));
pthread_mutex_lock(&(camera->capturestatemutex));
camera->capturestate = CAPTURING;
pthread_cond_signal(&(camera->capturestatecond));
pthread_mutex_unlock(&(camera->capturestatemutex));
// initialize frame locks.
pthread_mutex_init(&(camera->lastframemutex), NULL);
camera->framelock = (pthread_rwlock_t *)malloc(camera->mbuf.frames *
sizeof(pthread_rwlock_t));
for(frame = 0; frame < camera->mbuf.frames; frame++)
{
pthread_rwlock_init(&(camera->framelock[frame]),NULL);
}
camera->updated = 1;
// start capture thread
if(pthread_create((&(camera->thread)),NULL,
icvVideoCaptureProc, (void*)cameraid))
{
fprintf(stderr, "icvVideoStart: couldn't start thread for "
"camera %d\n", camera);
return 0;
}//if pthread_create ...
#ifdef DEBUG_THREADS
printf("started icvVideoCaptureProc thread %p from thread %p\n",
camera->thread, pthread_self());
#endif
if(camera->rendered)
{
#ifdef DEBUG_CVCAM
printf("icvVideoStart: start rendering\n");
#endif
icvVideoRenderStart(cameraid);
}
return 1;
}
////////////////////////////////////////////////////////////////////////////////
void* icvVideoCaptureProc(void* arg)
{
int cameraid = (int) arg;
CvVideoCamera* const camera = &(cameras[cameraid]);
assert(cameras != NULL);
assert(cameraid>=0 && cameraid <ncameras);
assert(camera->mbuf.frames>0);
pthread_mutex_lock(&(camera->capturestatemutex));
while(camera->capturestate == CAPTURING)
{
pthread_mutex_unlock(&(camera->capturestatemutex));
#ifdef DEBUG_CVCAM
printf("*");
fflush(stdout);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -