source: flair-src/trunk/lib/FlairSensorActuator/src/V4LCamera.cpp@ 3

Last change on this file since 3 was 3, checked in by Sanahuja Guillaume, 7 years ago

sensoractuator

File size: 5.9 KB
Line 
1// %flair:license{
2// This file is part of the Flair framework distributed under the
3// CECILL-C License, Version 1.0.
4// %flair:license}
5// created: 2014/07/17
6// filename: V4LCamera.cpp
7//
8// author: Guillaume Sanahuja
9// Copyright Heudiasyc UMR UTC/CNRS 7253
10//
11// version: $Id: $
12//
13// purpose: base class for V4l camera
14//
15//
16/*********************************************************************/
17
18#include "V4LCamera.h"
19#include <GroupBox.h>
20#include <DoubleSpinBox.h>
21#include <CheckBox.h>
22#include <GridLayout.h>
23#include <Label.h>
24#include <cvimage.h>
25#include <FrameworkManager.h>
26#include <linux/videodev2.h>
27
28using std::string;
29using namespace flair::core;
30using namespace flair::gui;
31
32namespace flair
33{
34namespace sensor
35{
36
37V4LCamera::V4LCamera(const FrameworkManager* parent,string name,uint8_t camera_index,uint16_t width,uint16_t height,cvimage::Type::Format format,uint8_t priority) : Thread(parent,name,priority), Camera(parent,name,width,height,format)
38{
39 capture = cvCaptureFromCAM(camera_index);//a mettre apres l'init dsp
40
41 if(capture<0) Thread::Err("cvCaptureFromCAM error\n");
42
43 if(cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH,width)<0) Thread::Err("cvSetCaptureProperty error\n");
44 if(cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT,height)<0) Thread::Err("cvSetCaptureProperty error\n");
45
46 if(format==cvimage::Type::Format::UYVY)
47 {
48 if(cvSetCaptureProperty(capture,CV_CAP_PROP_FORMAT,V4L2_PIX_FMT_UYVY)<0) Thread::Err("cvSetCaptureProperty error\n");
49 }
50 else if(format==cvimage::Type::Format::YUYV)
51 {
52 if(cvSetCaptureProperty(capture,CV_CAP_PROP_FORMAT,V4L2_PIX_FMT_YUYV)<0) Thread::Err("cvSetCaptureProperty error\n");
53 }
54 else
55 {
56 Thread::Err("format not supported\n");
57 }
58
59 //station sol
60 gain=new DoubleSpinBox(GetGroupBox()->NewRow(),"gain:",0,1,0.1);
61 exposure=new DoubleSpinBox(GetGroupBox()->LastRowLastCol(),"exposure:",0,1,0.1);
62 bright=new DoubleSpinBox(GetGroupBox()->LastRowLastCol(),"bright:",0,1,0.1);
63 contrast=new DoubleSpinBox(GetGroupBox()->LastRowLastCol(),"contrast:",0,1,0.1);
64 hue=new DoubleSpinBox(GetGroupBox()->LastRowLastCol(),"hue:",0,1,0.1);
65 sharpness=new DoubleSpinBox(GetGroupBox()->LastRowLastCol(),"sharpness:",0,1,0.1);
66 sat=new DoubleSpinBox(GetGroupBox()->LastRowLastCol(),"saturation:",0,1,0.1);
67 autogain=new CheckBox(GetGroupBox()->NewRow(),"autogain:");
68 autoexposure=new CheckBox(GetGroupBox()->LastRowLastCol(),"autoexposure:");
69 awb=new CheckBox(GetGroupBox()->LastRowLastCol(),"awb:");
70 fps=new Label(GetGroupBox()->NewRow(),"fps");
71}
72
73V4LCamera::~V4LCamera()
74{
75 SafeStop();
76 Join();
77}
78
79void V4LCamera::Run(void)
80{
81 Time cam_time,new_time,fpsNow,fpsPrev;
82 IplImage* img;//raw image
83 int fpsCounter=0;
84
85 //init image old
86 if(!cvGrabFrame(capture))
87 {
88 Printf("Could not grab a frame\n");
89 }
90 cam_time=GetTime();
91 fpsPrev = cam_time;
92
93 while(!ToBeStopped())
94 {
95 //fps counter
96 fpsCounter++;
97 if(fpsCounter==100) {
98 fpsNow = GetTime();
99 fps->SetText("fps: %.1f",fpsCounter/((float)(fpsNow - fpsPrev)/1000000000.));
100 fpsCounter=0;
101 fpsPrev=fpsNow;
102 }
103
104 //cam properties
105 if(gain->ValueChanged()==true && autogain->Value()==false) SetGain(gain->Value());
106 if(exposure->ValueChanged()==true && autoexposure->Value()==false) SetExposure(exposure->Value());
107 if(bright->ValueChanged()==true) SetBrightness(bright->Value());
108 if(sat->ValueChanged()==true) SetSaturation(sat->Value());
109 if(contrast->ValueChanged()==true) SetContrast(contrast->Value());
110 if(hue->ValueChanged()==true) SetHue(hue->Value());
111 if(sharpness->ValueChanged()==true) cvSetCaptureProperty(capture,CV_CAP_PROP_SHARPNESS,sharpness->Value());
112 if(autogain->ValueChanged()==true)
113 {
114 if(autogain->Value()==true)
115 {
116 gain->setEnabled(false);
117 }
118 else
119 {
120 gain->setEnabled(true);
121 SetGain(gain->Value());
122 }
123 SetAutoGain(autogain->Value());
124 }
125 if(autoexposure->ValueChanged()==true)
126 {
127 if(autoexposure->Value()==true)
128 {
129 exposure->setEnabled(false);
130 }
131 else
132 {
133 exposure->setEnabled(true);
134 SetExposure(exposure->Value());
135 }
136 SetAutoExposure(autoexposure->Value());
137 }
138 if(awb->ValueChanged()==true) cvSetCaptureProperty(capture,CV_CAP_PROP_AWB,awb->Value());
139
140
141 //cam pictures
142 img=cvRetrieveRawFrame(capture);
143 if(!cvGrabFrame(capture))
144 {
145 Printf("Could not grab a frame\n");
146 }
147 new_time=GetTime();
148
149 output->GetMutex();
150 output->img->imageData=img->imageData;
151 output->ReleaseMutex();
152
153 output->SetDataTime(cam_time);
154 ProcessUpdate(output);
155
156 cam_time=new_time;
157 }
158
159 cvReleaseCapture(&capture);
160}
161
162void V4LCamera::SetAutoGain(bool value)
163{
164 cvSetCaptureProperty(capture,CV_CAP_PROP_AUTOGAIN,value);
165}
166
167void V4LCamera::SetAutoExposure(bool value)
168{
169 Thread::Warn("not implemented in opencv\n");
170}
171
172void V4LCamera::SetGain(float value)
173{
174 cvSetCaptureProperty(capture,CV_CAP_PROP_GAIN,value);
175}
176
177void V4LCamera::SetExposure(float value)
178{
179 cvSetCaptureProperty(capture,CV_CAP_PROP_EXPOSURE,value);
180}
181
182void V4LCamera::SetBrightness(float value)
183{
184 cvSetCaptureProperty(capture,CV_CAP_PROP_BRIGHTNESS,value);
185}
186
187void V4LCamera::SetSaturation(float value)
188{
189 cvSetCaptureProperty(capture,CV_CAP_PROP_SATURATION,value);
190}
191
192void V4LCamera::SetHue(float value)
193{
194 cvSetCaptureProperty(capture,CV_CAP_PROP_HUE,value);
195}
196
197void V4LCamera::SetContrast(float value)
198{
199 cvSetCaptureProperty(capture,CV_CAP_PROP_CONTRAST,value);
200}
201
202} // end namespace sensor
203} // end namespace flair
Note: See TracBrowser for help on using the repository browser.