17#include <opencv2/videoio/videoio_c.h>
20: m_VideoCapture(nullptr),
21 m_CurrentImage(nullptr),
22 m_CurrentVideoTexture(nullptr),
23 m_PauseImage(nullptr),
24 m_GrabbingDeviceNumber(-1),
27 m_UndistortImage(false),
28 m_FlipXAxisEnabled(false),
29 m_FlipYAxisEnabled(false)
41 m_VideoFileName = filename;
43 m_VideoCapture = cvCaptureFromFile(filename);
45 MITK_WARN <<
"Error in initializing video file input!";
47 m_RepeatVideo = repeatVideo;
56 m_GrabbingDeviceNumber = cameraindex;
57 m_VideoCapture = cvCaptureFromCAM(m_GrabbingDeviceNumber);
59 MITK_ERROR <<
"Error in initializing CVHighGUI video camera!"<< std::endl;
66 return cvGetCaptureProperty(m_VideoCapture, property_id);
71 return cvSetCaptureProperty(m_VideoCapture, property_id, value);
79 if (m_FlipXAxisEnabled || m_FlipYAxisEnabled)
82 m_CurrentImage = this->FlipImage(m_CurrentImage);
87 this->UpdateVideoTexture();
88 return this->m_CurrentVideoTexture;
96 cv::Mat copy = cv::cvarrToMat( m_CurrentImage,
false );
104 return m_CurrentImage;
113 image->origin = m_CurrentImage->origin;
114 memcpy(image->imageData,m_CurrentImage->imageData,m_CurrentImage->width*m_CurrentImage->height*m_CurrentImage->nChannels);
121 if(m_CapturingInProcess)
128 m_CurrentImage = cvQueryFrame(m_VideoCapture);
132 if(m_CurrentImage ==
nullptr)
134 double framePos = this->GetVideoCaptureProperty(CV_CAP_PROP_POS_AVI_RATIO);
135 MITK_DEBUG <<
"End of video file found. framePos: " << framePos;
136 if(m_RepeatVideo && framePos >= 0.99)
138 MITK_DEBUG <<
"Restarting video file playback.";
139 this->SetVideoCaptureProperty(CV_CAP_PROP_POS_AVI_RATIO, 0);
141 m_CurrentImage = cvQueryFrame(m_VideoCapture);
145 std::ostringstream s;
146 s <<
"End of video file " << m_VideoFileName;
147 std::logic_error err( s.str() );
154 if(m_UndistortImage && m_UndistortCameraImage.IsNotNull())
155 m_UndistortCameraImage->UndistortImageFast(m_CurrentImage,
nullptr);
158 if(m_CaptureWidth == 0 || m_CaptureHeight == 0)
160 MITK_DEBUG <<
"Trying to set m_CaptureWidth & m_CaptureHeight.";
161 m_CaptureWidth = m_CurrentImage->width;
162 m_CaptureHeight = m_CurrentImage->height;
163 MITK_INFO <<
"frame width: " << m_CaptureWidth <<
", height: " << m_CaptureHeight;
164 m_CurrentImage->origin = 0;
175 if(m_CurrentVideoTexture ==
nullptr)
176 m_CurrentVideoTexture =
new unsigned char[m_CaptureWidth*m_CaptureHeight*3];
178 int width = m_CurrentImage->width;
179 int height = m_CurrentImage->height;
180 int widthStep = m_CurrentImage->widthStep;
181 int nChannels = m_CurrentImage->nChannels;
182 unsigned char* tex = m_CurrentVideoTexture;
183 char* data = m_CurrentImage->imageData;
184 char* currentData = m_CurrentImage->imageData;
190 for(
int i=0;i<width*height*3;i+=3,++wIndex)
199 iout = -hIndex+height-1;
202 currentData = data + iout*widthStep;
204 tex[i+2] = currentData[jout*nChannels + 0];
205 tex[i+1] = currentData[jout*nChannels + 1];
206 tex[i] = currentData[jout*nChannels + 2];
213 if(m_VideoCapture !=
nullptr)
214 m_CapturingInProcess =
true;
216 m_CapturingInProcess =
false;
221 m_CapturePaused =
false;
222 m_CapturingInProcess =
false;
227 return m_UndistortCameraImage;
232 m_CapturePaused = !m_CapturePaused;
236 m_PauseImage = cvCloneImage(m_CurrentImage);
240 m_UndistortCameraImage->UndistortImageFast(m_PauseImage,
nullptr);
241 m_CurrentImage = m_PauseImage;
245 cvReleaseImage( &m_PauseImage );
246 m_CurrentImage =
nullptr;
247 m_PauseImage =
nullptr;
254 m_UndistortImage =
true;
256 kc[0] = distortion[0]; kc[1] = distortion[1];
257 kc[2] = distortion[2]; kc[3] = distortion[3];
258 if(m_CaptureWidth == 0 || m_CaptureHeight == 0)
261 m_UndistortCameraImage = mitk::UndistortCameraImage::New();
262 m_UndistortCameraImage->SetUndistortImageFastInfo(focal[0], focal[1], principal[0], principal[1], kc, (
float)m_CaptureWidth, (
float)m_CaptureHeight);
267 m_UndistortImage =
false;
279 int rowsize = 3 * m_CaptureWidth;
283 picture = this->m_CurrentImage->imageData;
284 bufferend = this->m_CurrentImage->imageData + 3*(m_CaptureHeight*m_CaptureWidth);
290 for(
char* datapointer = bufferend - rowsize;datapointer >= picture; datapointer -= rowsize)
292 for(
char* current = datapointer; current < datapointer + rowsize; current++)
294 b = *current; current++;
295 g = *current; current++;
297 RGBtoHSV(r,g,b,h,s,v);
309 std::cout <<
"Exception raised mitkOpenCVVideoSource: get hsv itk image conversion error." << std::endl;
326 if (g > mx){ mx=g;maxVal=1;}
327 if (b > mx){ mx=b;maxVal=2;}
331 float delta = mx - mn;
351 case 0:{h = ( g - b ) / delta;
break;}
352 case 1:{h = 2 + ( b - r ) / delta;
break;}
353 case 2:{h = 4 + ( r - g ) / delta;
break;}
358 if( h < 0 ) h += 360;
369 std::cout<<
"openCVVideoSource: Current video image is null! "<< std::endl;
373 if(m_FlipXAxisEnabled && !m_FlipYAxisEnabled)
375 cvFlip(input,
nullptr,0);
377 if(!m_FlipXAxisEnabled && m_FlipYAxisEnabled)
379 cvFlip(input,
nullptr,1);
381 if(m_FlipXAxisEnabled && m_FlipYAxisEnabled)
383 cvFlip(input,
nullptr,-1);
392 this->StopCapturing();
393 this->m_FrameCount = 0;
395 cvReleaseCapture(&m_VideoCapture);
396 m_VideoCapture =
nullptr;
397 m_CurrentImage =
nullptr;
400 delete m_CurrentVideoTexture;
401 m_CurrentVideoTexture =
nullptr;
403 cvReleaseImage(&m_PauseImage);
404 m_PauseImage =
nullptr;
405 m_CapturePaused =
false;
406 m_VideoFileName.clear();
407 m_GrabbingDeviceNumber = -1;
410 m_UseCVCAMLib =
false;
417 this->m_FlipXAxisEnabled = enable;
423 this->m_FlipXAxisEnabled = enable;
void RGBtoHSV(float r, float g, float b, float &h, float &s, float &v)
virtual void GetCurrentFrameAsItkHSVPixelImage(HSVPixelImageType::Pointer &Image)
virtual void SetVideoCameraInput(int cameraindex, bool useCVCAMLib=false)
virtual IplImage * FlipImage(IplImage *input)
itk::ImageRegionIterator< HSVPixelImageType > HSVConstIteratorType
itk::FixedArray< float, 3 > HSVPixelType
unsigned char * GetVideoTexture() override
virtual void SetEnableXAxisFlip(bool enable)
void UpdateVideoTexture()
void StopCapturing() override
void PauseCapturing() override
virtual void GetCurrentFrameAsOpenCVImage(IplImage *image)
void StartCapturing() override
void FetchFrame() override
virtual void SetEnableYAxisFlip(bool enable)
virtual const IplImage * GetCurrentFrame()
virtual void DisableOnlineImageUndistortion()
cv::Mat GetImage() override
virtual int SetVideoCaptureProperty(int property_id, double value)
virtual void EnableOnlineImageUndistortion(mitk::Point3D focal, mitk::Point3D principal, mitk::Point4D distortion)
virtual double GetVideoCaptureProperty(int property_id)
virtual void SetVideoFileInput(const char *filename, bool repeatVideo, bool useCVCAMLib=false)
~OpenCVVideoSource() override
virtual bool OnlineImageUndistortionEnabled() const