+#include <iostream>\r
+#include "Capture_A.h"\r
+\r
+using std::cerr;\r
+using std::cout;\r
+using std::endl;\r
+\r
+//http://docs.opencv.org/doc/tutorials/highgui/video-input-psnr-ssim/video-input-psnr-ssim.html\r
+\r
+/*----------------------------------------------------------------------*\\r
+ |* Declaration *|\r
+ \*---------------------------------------------------------------------*/\r
+\r
+/*--------------------------------------*\\r
+ |* Public *|\r
+ \*-------------------------------------*/\r
+\r
+/*--------------------------------------*\\r
+ |* Private *|\r
+ \*-------------------------------------*/\r
+\r
+/*----------------------------------------------------------------------*\\r
+ |* Implementation *|\r
+ \*---------------------------------------------------------------------*/\r
+\r
+/*--------------------------------------*\\r
+ |* Public *|\r
+ \*-------------------------------------*/\r
+\r
+/*------------------*\\r
+ |* Constructeur *|\r
+ \*-----------------*/\r
+\r
+/**\r
+ * Optimisation Cuda:\r
+ * Principe:\r
+ * Use pinned memory in host side\r
+ * Give this area to openCV\r
+ * Syntaxe:\r
+ * size_t sizeOctets=w*h*sizeof(uchar4);\r
+ * uchar4* ptrHostMemory;\r
+ * HANDLE_ERROR( cudaHostAlloc ((void**) &ptrHostMemory, sizeOctets,cudaHostAllocDefault ) );\r
+ *\r
+ * Usage:\r
+ * CaptureVideo captureur(pathToVideo, titre);\r
+ * Mat matImage=captureur.capturer(); // capture une image seulement ( à utiliser en boucle!)\r
+ * uchar4* image= CaptureVideo::castToUChar4(&matImage); // format cuda\r
+ */\r
+Capture_A::Capture_A(VideoCapture* ptrCaptureStream, const string& title, uchar4* ptrHostMemory):chrono()\r
+ {\r
+ // cout << "[Capture_A] : Capture_A" << endl;\r
+\r
+ this->title = title;\r
+ this->compteurCapture = 0;\r
+ this->ptrCaptureStream = ptrCaptureStream;\r
+\r
+ this->w = (int) ptrCaptureStream->get(CV_CAP_PROP_FRAME_WIDTH);\r
+ this->h = (int) ptrCaptureStream->get(CV_CAP_PROP_FRAME_HEIGHT);\r
+\r
+ // chrono=Chronos();\r
+\r
+ if(ptrHostMemory!=NULL)\r
+ {\r
+ matCaptureSrc=Mat(w,h,CV_BGR2RGBA,ptrHostMemory); // Ecrase ancienne\r
+ }\r
+ }\r
+\r
+Capture_A::~Capture_A(void)\r
+ {\r
+ if (ptrCaptureStream != NULL)\r
+ {\r
+ delete ptrCaptureStream;\r
+ ptrCaptureStream = NULL;\r
+ }\r
+ }\r
+\r
+/*------------------*\\r
+ |* Methode *|\r
+ \*-----------------*/\r
+\r
+Mat Capture_A::capturer(void)\r
+ {\r
+ //cout << "[Capture_A] : capturer" << endl;\r
+\r
+ compteurCapture++;\r
+\r
+ //(*ptrCaptureStream) >> matCaptureSrc; // plante en fin de video\r
+ readStream(this->ptrCaptureStream, &this->matCaptureSrc); // methode virtuelle : au lieu de ci-dessous, plus robuste\r
+\r
+ // debug\r
+ {\r
+ //printInfo();\r
+ }\r
+\r
+ // old\r
+ {\r
+ // Type image:\r
+ // CV_8U CV_ => BVRA et non RVBA => demande correction TODO Mieux?\r
+ // RGB2GRAY\r
+ // int nbChannel = 4; // 0 keep same chanel // 4 permet par exemple d'ajouter la couche alpha à rvb (pour une video ou webcam)\r
+ // cvtColor(matCaptureSrc, matCaptureDest, CV_8U, nbChannel);\r
+ }\r
+\r
+ // new\r
+ {\r
+ // http://siggiorn.com/wp-content/uploads/libraries/opencv-java/docs/sj/opencv/Constants.ColorConversion.html\r
+ //int colorConversion=CV_BGR2GRAY; // ok\r
+ //int colorConversion=CV_BGR2RGBA ; // ko\r
+ int colorConversion = CV_BGR2BGRA; // ok\r
+ cvtColor(matCaptureSrc, matCaptureDest, colorConversion);\r
+ }\r
+\r
+ return matCaptureDest; //castToUChar4(matCapture.data);\r
+ }\r
+\r
+void Capture_A::printInfo(void)\r
+ {\r
+ cout << "[Capture_A] : Capture Info :" << endl;\r
+ cout << "\t(w,h) = (" << w << "," << h << ")" << endl;\r
+ cout << "\ttitle = " << title << endl;\r
+ cout << "\tnbChannel = " << matCaptureSrc.channels() << endl;\r
+ cout << "\ttype = " << matCaptureSrc.type() << endl;\r
+ cout << "\tisEmpty = " << matCaptureSrc.empty() << endl;\r
+ cout << "\tdtMS(source) = " << dtOriginalMS() << endl;\r
+\r
+ if (compteurCapture >= 2)\r
+ {\r
+ cout << "\tfps(capture) = " << fpsCapture() << endl;\r
+ }\r
+\r
+ cout << "\tchrono = " << chrono.timeFlight() << " (s)"<< endl;\r
+ cout << "\t#image = " << compteurCapture << endl;\r
+ }\r
+\r
+int Capture_A::nbOctetImage()\r
+ {\r
+ return w * h * sizeof(uchar4);\r
+ }\r
+\r
+int Capture_A::fpsCapture()\r
+ {\r
+ double timeS = chrono.timeFlight();\r
+ double fps = compteurCapture / timeS;\r
+\r
+ return (int) fps;\r
+ }\r
+\r
+/*------------------*\\r
+ |* is *|\r
+ \*-----------------*/\r
+\r
+bool Capture_A::isOpened(void)\r
+ {\r
+ return ptrCaptureStream->isOpened();\r
+ }\r
+\r
+/*------------------*\\r
+ |* get *|\r
+ \*-----------------*/\r
+\r
+VideoCapture* Capture_A::getVideoCapture()\r
+ {\r
+ return ptrCaptureStream;\r
+ }\r
+\r
+int Capture_A::getW(void)\r
+ {\r
+ return w;\r
+ }\r
+\r
+int Capture_A::getH(void)\r
+ {\r
+ return h;\r
+ }\r
+\r
+int Capture_A::dtOriginalMS()\r
+ {\r
+ return 0;\r
+ }\r
+\r
+long Capture_A::nbCapture()\r
+ {\r
+ return compteurCapture;\r
+ }\r
+\r
+string Capture_A::getTitle()\r
+ {\r
+ return title;\r
+ }\r
+\r
+Chronos Capture_A::getChronos()\r
+ {\r
+ return chrono;\r
+ }\r
+\r
+/*--------------------------------------*\\r
+ |* Static *|\r
+ \*-------------------------------------*/\r
+\r
+/**\r
+ * uchar = unsigned char\r
+ * uchar4 = 4 char sequentiel\r
+ */\r
+uchar4* Capture_A::castToUChar4(uchar* ptrTab)\r
+ {\r
+ return (uchar4*) ptrTab;\r
+ }\r
+\r
+/**\r
+ * uchar = unsigned char\r
+ * uchar4 = 4 char sequentiel\r
+ */\r
+uchar4* Capture_A::castToUChar4(Mat* ptrMap)\r
+ {\r
+ return castToUChar4(ptrMap->data);\r
+ }\r
+\r
+/*--------------------------------------*\\r
+ |* Private *|\r
+ \*-------------------------------------*/\r
+\r
+// http://opencv.willowgarage.com/documentation/cpp/reading_and_writing_images_and_video.html#cv-videocapture-get\r
+// TODO: fixme marche pas trop bien\r
+// capture.set(CV_CAP_PROP_FRAME_WIDTH,1280);\r
+// capture.set(CV_CAP_PROP_FRAME_HEIGHT ,720);\r
+//capture.set(CV_CAP_PROP_EXPOSURE,0);\r
+// int n = matCapture.rows;\r
+// int m = matCapture.cols;\r
+//\r
+//uchar* ptr=matCapture.data;\r
+// unsigned char* ptr4=(unsigned char*)ptr;\r
+// cout<<"size uchar = "<<sizeof(uchar)<<endl;\r
+// cout<<"size unsigned char = "<<sizeof(unsigned char)<<endl;\r
+// cout<<"size uchar4 = "<<sizeof(uchar4)<<endl;\r
+// cout<<"n= "<<n<<endl;\r
+// cout<<"m= "<<m<<endl;\r
+// uchar* ptrCopy=new uchar[n*m];\r
+// uchar* ptrAgain=ptrCopy;\r
+// for(int i=1;i<=n*m*4;i++)\r
+// {\r
+// *ptr++=123;\r
+// }\r
+//cout<<"i"<<i<<endl;\r
+// *ptrCopy=*ptr4;\r
+//// ptrCopy++;\r
+// *ptr4=123;\r
+// ptr4++;\r
+//\r
+//// //*ptrCopy=*ptr4;\r
+//// ptrCopy++;\r
+//// ptr4++;\r
+////\r
+//// //*ptrCopy=*ptr4;\r
+//// ptrCopy++;\r
+//// ptr4++;\r
+////\r
+//// //*ptrCopy=*ptr4;\r
+////\r
+//// if(i<n*m)\r
+//// {\r
+//// ptrCopy++;\r
+////\r
+//// ptr4++;\r
+//// }\r
+// }\r
+//// for(int i=1;i<=n*m;i++)\r
+//// {\r
+//// //cout<<"i"<<i<<"\t";\r
+//// assert(ptr[i-1]==ptrAgain[i-1]);\r
+//// }\r
+// CV_8U : [0,255]\r
+// CV_16U : [0,65535]\r
+// CV_32F : [0,1] in R\r
+//cvtColor(matCapture, matCapture, CV_8U,0); // 0 keep same chanel\r
+// cvtColor(matCapture, matCapture, CV_8U,4); // 0 keep same chanel // 4 permet par exemple d'ajouter la couche alpha à rvb (pour une video ou webcam)\r
+/*----------------------------------------------------------------------*\\r
+ |* End *|\r
+ \*---------------------------------------------------------------------*/\r
+\r