Ajout de l'ensemble du workspace.
[GPU.git] / WCudaMSE / BilatTools_OpenCV / src / core / capture / cpp / Capture_A.cpp
diff --git a/WCudaMSE/BilatTools_OpenCV/src/core/capture/cpp/Capture_A.cpp b/WCudaMSE/BilatTools_OpenCV/src/core/capture/cpp/Capture_A.cpp
new file mode 100755 (executable)
index 0000000..cf614bb
--- /dev/null
@@ -0,0 +1,279 @@
+#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