/trunk/ fads/Fl_OpenCV.cxx

https://gitlab.com/BGCX067/fads-svn-to-git · C++ · 347 lines · 270 code · 64 blank · 13 comment · 47 complexity · ef22cd51f8892c380f5fef1a19dc5eb8 MD5 · raw file

  1. #include <FL/Fl.H>
  2. #include <FL/fl_draw.H>
  3. #include "Fl_OpenCV.h"
  4. IplImage *fl_LoadImage(char*filename,int iscolor)
  5. {
  6. IplImage *cd,*image;
  7. if( (cd = cvLoadImage(filename, iscolor)) == 0 ){
  8. fl_alert("Image not opened !");
  9. return NULL;
  10. }
  11. if( cd->nChannels==3){
  12. // from showimage
  13. CvMat * mat, stub;
  14. int origin=0;
  15. origin = cd->origin;
  16. mat = cvGetMat(cd, &stub);
  17. cvConvertImage( mat, cd,(origin != 0 ? CV_CVTIMG_FLIP : 0) + CV_CVTIMG_SWAP_RB );
  18. }
  19. if(cd->widthStep!=cd->width*cd->nChannels) {
  20. image = cvCreateImage(cvSize(cd->width,cd->height), IPL_DEPTH_8U, cd->nChannels);
  21. image->widthStep=image->width*cd->nChannels;
  22. cvResize( cd,image, CV_INTER_LINEAR );
  23. cvReleaseImage(&cd);
  24. return image;
  25. }
  26. else
  27. return cd;
  28. }
  29. bool fl_SaveImage(char*filename,IplImage *image)
  30. {
  31. if(image->nChannels==3){
  32. cvConvertImage( image,image,CV_CVTIMG_SWAP_RB );
  33. if((cvSaveImage(filename,image)) == 0 ){
  34. fl_alert("Image not saved");
  35. cvConvertImage( image,image,CV_CVTIMG_SWAP_RB );
  36. return false;
  37. }
  38. cvConvertImage( image,image,CV_CVTIMG_SWAP_RB );
  39. } else if((cvSaveImage(filename,image)) == 0 ){
  40. fl_alert("Image not saved");
  41. return false;
  42. }
  43. return true;
  44. }
  45. // Fl_OpenCv
  46. void Fl_OpenCV::draw(int xx, int yy, int ww, int hh)
  47. {
  48. if(!image) return;
  49. fl_push_clip(x(),y(),ww,hh);
  50. float fx, fy, scale;
  51. fx=(float)image->width/ww;
  52. fy=(float)image->height/hh;
  53. if(fx>fy)
  54. scale=fx;
  55. else
  56. scale=fy;
  57. if(fit && scale > 1.0){
  58. if(fimage)
  59. cvReleaseImage(&fimage);
  60. fimage = cvCreateImage(cvSize(cvFloor(image->width/scale),cvFloor(image->height/scale)),image->depth,image->nChannels);
  61. fimage->widthStep=fimage->width*fimage->nChannels;
  62. cvResize( image,fimage, CV_INTER_LINEAR );
  63. fl_draw_image((uchar *)fimage->imageData,xx, yy, fimage->width, fimage->height, fimage->nChannels , 0);
  64. }
  65. else
  66. fl_draw_image((uchar *)image->imageData,xx, yy,image->width, image->height, image->nChannels , 0);
  67. fl_pop_clip();
  68. }
  69. Fl_OpenCV::Fl_OpenCV(int X,int Y,int W,int H, char *filename):Fl_Widget(X,Y,W,H,0)
  70. {
  71. x(X);y(Y);w(W);h(H);
  72. image=NULL;
  73. fimage=NULL;
  74. fit=false;
  75. mouse_cb=NULL;
  76. if(filename){
  77. Load(filename);
  78. }
  79. }
  80. Fl_OpenCV::Fl_OpenCV(int X, int Y):Fl_Widget(X,Y,1,1,0)
  81. {
  82. image=NULL;
  83. fimage=NULL;
  84. fit=false;
  85. mouse_cb=NULL;
  86. x(X);y(Y);
  87. }
  88. bool Fl_OpenCV::Load(char*filename,int iscolor)
  89. {
  90. if(image)
  91. cvReleaseImage(&image);
  92. if( (image = fl_LoadImage(filename, iscolor)) == 0 )
  93. return false;
  94. if(fit==false){
  95. w(image->width);
  96. h(image->height);
  97. resize(x(),y(),w(),h());
  98. }
  99. draw();
  100. return true;
  101. }
  102. bool Fl_OpenCV::Save(char*filename)
  103. {
  104. if((fl_SaveImage(filename,image)) == 0 ){
  105. fl_alert("Image not saved");
  106. return false;
  107. }
  108. else
  109. return true;
  110. }
  111. void Fl_OpenCV::SetImage(IplImage *nimage)
  112. {
  113. if(image)
  114. cvReleaseImage(&image);
  115. image=nimage;
  116. if(fit==false){
  117. w(image->width);
  118. h(image->height);
  119. resize(x(),y(),w(),h());
  120. }
  121. draw();
  122. }
  123. void Fl_OpenCV::FitWindows()
  124. {
  125. fit=true;
  126. }
  127. void Fl_OpenCV::SetMouseCallback(CvMouseCallback on_mouse)
  128. {
  129. mouse_cb=on_mouse;
  130. }
  131. int Fl_OpenCV::handle(int event)
  132. {
  133. // Mouse Events
  134. if (event == FL_PUSH || event ==FL_DRAG || event == FL_MOVE || event == FL_RELEASE) {
  135. if(mouse_cb && image )
  136. // if(mouse_cb)
  137. mouse_cb(event,Fl::event_x()-x(),Fl::event_y()-y(),0,0);
  138. }
  139. return(Fl_Widget::handle(event));
  140. }
  141. Fl_OpenCV::~Fl_OpenCV()
  142. {
  143. if(image)
  144. cvReleaseImage(&image);
  145. }
  146. // Video
  147. bool Fl_Capture::CaptureFromFile( char* filename )
  148. {
  149. if(cap)
  150. cvReleaseCapture(&cap);
  151. cap= cvCaptureFromFile(filename);
  152. if(cap == NULL)
  153. {
  154. fl_alert("Video not opened");
  155. return false;
  156. }
  157. else
  158. return true;
  159. }
  160. bool Fl_Capture::CaptureFromCAM( int index )
  161. {
  162. cap= cvCaptureFromCAM(index );
  163. if(cap == NULL)
  164. {
  165. fl_alert("ERROR! VideoCAM cannot be opened");
  166. return false;
  167. }
  168. else
  169. return true;
  170. }
  171. int Fl_Capture::GrabFrame()
  172. {
  173. return cvGrabFrame(cap);
  174. }
  175. void Fl_Capture::RetrieveFrame()
  176. {
  177. frame=cvRetrieveFrame(cap);
  178. if(!frame) fl_alert("Frame not Retrieved");
  179. }
  180. void Fl_Capture::QueryFrame()
  181. {
  182. frame=cvQueryFrame(cap);
  183. if(!frame) fl_alert("Frame not Retrieved");
  184. }
  185. void Fl_Capture::ShowFrame()
  186. {
  187. }
  188. IplImage * Fl_Capture::GetFrame()
  189. {
  190. IplImage *image=NULL;
  191. GrabFrame();
  192. RetrieveFrame();
  193. if(frame){
  194. if(frame->nChannels==3){
  195. // from showimage
  196. CvMat * mat, stub;
  197. int origin=0;
  198. origin = frame->origin;
  199. mat = cvGetMat(frame, &stub);
  200. // cvConvertImage( mat, frame,(origin != 0 ? CV_CVTIMG_FLIP : 0) + CV_CVTIMG_SWAP_RB );
  201. cvConvertImage( mat, frame, CV_CVTIMG_SWAP_RB );
  202. image = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U, 3);
  203. image->widthStep=image->width*3;
  204. // cvResize( frame,image, CV_INTER_LINEAR );
  205. if( frame->origin == IPL_ORIGIN_TL )
  206. cvCopy( frame, image, 0 );
  207. else
  208. cvFlip( frame, image, 0 );
  209. }
  210. else{
  211. // image=cd;
  212. image = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U, 1);
  213. image->widthStep=image->width*1;
  214. cvResize( frame,image, CV_INTER_LINEAR );
  215. }
  216. }
  217. return image;
  218. }
  219. double Fl_Capture::GetPositionMs()
  220. {
  221. return cvGetCaptureProperty(cap,CV_CAP_PROP_POS_MSEC);
  222. }
  223. double Fl_Capture::GetPositionFrame()
  224. {
  225. return cvGetCaptureProperty(cap,CV_CAP_PROP_POS_FRAMES);
  226. }
  227. double Fl_Capture::GetPositionPercent()
  228. {
  229. return (100*cvGetCaptureProperty(cap,CV_CAP_PROP_POS_AVI_RATIO));
  230. }
  231. double Fl_Capture::GetFrameWidth()
  232. {
  233. return cvGetCaptureProperty(cap,CV_CAP_PROP_FRAME_WIDTH );
  234. }
  235. double Fl_Capture::GetFrameHeight()
  236. {
  237. return cvGetCaptureProperty(cap,CV_CAP_PROP_FRAME_HEIGHT );
  238. }
  239. double Fl_Capture::GetFPS()
  240. {
  241. return cvGetCaptureProperty(cap,CV_CAP_PROP_FPS );
  242. }
  243. double Fl_Capture::GetCodec()
  244. {
  245. return cvGetCaptureProperty(cap,CV_CAP_PROP_FOURCC );
  246. }
  247. Fl_Capture::~Fl_Capture()
  248. {
  249. if(cap)
  250. cvReleaseCapture(&cap);
  251. }
  252. int Fl_Capture::SetPositionMs(double value)
  253. {
  254. return cvSetCaptureProperty( cap, CV_CAP_PROP_POS_MSEC, value );
  255. }
  256. int Fl_Capture::SetPositionFrame(double value)
  257. {
  258. return cvSetCaptureProperty( cap, CV_CAP_PROP_POS_FRAMES , value );
  259. }
  260. int Fl_Capture::SetPositionPercent(double value)
  261. {
  262. return cvSetCaptureProperty( cap, CV_CAP_PROP_POS_AVI_RATIO , value/100 );
  263. }
  264. int Fl_Capture::SetFrameWidth(double value)
  265. {
  266. // only for cameras
  267. return cvSetCaptureProperty( cap, CV_CAP_PROP_FRAME_WIDTH , value );
  268. }
  269. int Fl_Capture::SetFrameHeight(double value)
  270. {
  271. // only for cameras
  272. return cvSetCaptureProperty( cap, CV_CAP_PROP_FRAME_HEIGHT , value );
  273. }
  274. int Fl_Capture::SetFPS(double value)
  275. {
  276. // only for cameras
  277. return cvSetCaptureProperty( cap, CV_CAP_PROP_FPS , value );
  278. }
  279. int Fl_Capture::SetCodec(double value)
  280. {
  281. // only for cameras
  282. return cvSetCaptureProperty( cap, CV_CAP_PROP_FOURCC , value );
  283. }