Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将PByte转换为Mat OpenCV_C++_Opencv_Image Processing_Ps3 - Fatal编程技术网

C++ 将PByte转换为Mat OpenCV

C++ 将PByte转换为Mat OpenCV,c++,opencv,image-processing,ps3,C++,Opencv,Image Processing,Ps3,我正在使用带opencv的PS3摄像头,它使用PByte数据类型。将PByte作为帧结果。在SDK示例中,它们使用IplImage。我希望使用Mat代替IplImage。但我无法将PByte转换为Mat。如何将PByte转换为Mat?SDK中的示例 IplImage *pCapImage; PBYTE pCapBuffer = NULL; cvGetImageRawData(pCapImage, &pCapBuffer); while(_running)

我正在使用带opencv的PS3摄像头,它使用PByte数据类型。将PByte作为帧结果。在SDK示例中,它们使用IplImage。我希望使用Mat代替IplImage。但我无法将PByte转换为Mat。如何将PByte转换为Mat?SDK中的示例

     IplImage *pCapImage;
    PBYTE pCapBuffer = NULL;
    cvGetImageRawData(pCapImage, &pCapBuffer);
    while(_running)
        {
            cvGetImageRawData(pCapImage, &pCapBuffer);
            CLEyeCameraGetFrame(_cam, pCapBuffer, (i==0)?2000:0);
}
//Function from SDK

IMPORT(bool) CLEyeCameraGetFrame(CLEyeCameraInstance cam, PBYTE pData, int waitTimeout = 2000);
//MyCode//我使用2个摄像头

    cv::Mat pCapImage[2];
    PBYTE pCapBuffer = NULL;
    while(_running){

        for (int i = 0; i < 2; i++)
                {
                                  //trying convert
                    pCapImage[i] = cv::Mat (cvSize(w, h), 4, &pCapBuffer,IPL_DEPTH_8U).clone();

                    CLEyeCameraGetFrame(_cam[i], pCapBuffer);
                }

                Mat pCapImageMatL = pCapImage[0];
                Mat pCapImageMatR = pCapImage[1];
                imshow(_windowNameL, pCapImageMatL);
                imshow(_windowNameR, pCapImageMatR);
}
cv::Mat pCapImage[2];
PBYTE pCapBuffer=NULL;
当(_运行时){
对于(int i=0;i<2;i++)
{
//尝试转换
pCapImage[i]=cv::Mat(cvSize(w,h),4,&pCapBuffer,IPL_DEPTH_8U).clone();
CLEyeCameraGetFrame(_-cam[i],pCapBuffer);
}
Mat pCapImageMatL=pCapImage[0];
Mat pCapImageMatR=pCapImage[1];
imshow(_windowNameL,pCapImageMatL);
imshow(_windowNameR,pCapImageMatR);
}

鉴于您已成功将
PBYTE
转换为
IplImage*
,您可以进一步将其转换为
cv::Mat
,如下所示:

IplImage *pCapImage;  // this is the IplImage * that you have converted from PBYTE 
cv::Mat pCapImageMat(pCapImage);
cvReleaseImage(&pCapImage); // free the previous memory

如果您使用的是OpenCV 3,则IPlImage已被弃用。所以@herohuyongtao的回答不起作用

在这种情况下,解决方法是

cv::Mat frame;
frame = cv::cvarrToMat(pCapImage);

我可以在不使用pCapImage的情况下进行此操作吗。我只想让pCapBuffer直接映射。因为在文档中我看到IplImage需要manuel内存管理。我可以不用pCapImage来实现吗。我只想让pCapBuffer直接匹配。因为在文档中我看到IplImage需要manuel内存管理。@user1924375然后释放以前的内存。这很容易。请检查更新的答案。