2014-12-12 18 views
12

Desidero utilizzare UMat in modo che il mio codice possa essere eseguito su GPU e CPU utilizzando OpenCL (OpenCV 3.0.0 Beta).Come leggere UMat da un file in opencv 3.0 Beta?

ma non riesco a trovare un modo per leggere un file di immagine in un UMat o convertire un Mat a UMat.

Come posso leggere un'immagine in un UMat?

risposta

-2

È possibile convertire (copiare i dati sottostanti) cv :: Mat in cv :: UMat e viceversa utilizzando il metodo copyTo.

Ecco il codice di esempio, che utilizza cv::UMat:

//VideoCapture tCapturer("2.avi"); // source is set to be the clip 
VideoCapture tCapturer(0); // source is set to be the camera 
UMat tUFrame; 

if (!tCapturer.isOpened()) 
{ 
    cout << "Could not open video file!" << endl; 
    getchar(); 
    return -1; 
} 
else 
{ 
    cout << "Video file has been opened successfully!" << endl; 
    getchar(); 
} 

namedWindow("video", 1); 

while (true) 
{ 
    if (!tClip.read(tUFrame)) // get a new frame from camera 
    { 
     break; 
    } 

    Mat tRegularFrame; 
    tUFrame.copyTo(tRegularFrame); 

    imshow("video", tRegularFrame); 

    if (waitKey(30) >= 0) 
    { 
     break; 
    } 
} 
15

esempio per Mat a UMat conversione è al di sotto. Coudlnt 'trova la documentazione per questo. Quindi l'unica opzione era leggere il source.

UMat img = imread("lena.jpg", IMREAD_COLOR ).getUMat(ACCESS_READ); 

Diverse bandiere di accesso come in source sono

ACCESS_READ, ACCESS_WRITE, ACCESS_RW, ACCESS_FAST 

Per undestanding UMat utilizzo, un campione completo per il rilevamento del viso è disponibile here. Si noti inoltre che la documentazione fa ancora riferimento a flag meno recenti come secondo parametro imread. Potrebbe essere necessario utilizzare flag più recenti come nel file di intestazione di OpenCV.

+0

@mans - ha fatto questo lavoro? – Kiran

+0

C'è qualche documentazione [qui] (http://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html#ad3b86ff70d06f7e567e51d8d215c85cd), ma in effetti è ancora piuttosto criptico ... – Antonio

1

Per copertura uso Uimage.copyTo(image) o image=Uimage.getMat(cv::ACCESS_READ) ma in alcuni casi, in alcuni casi, genera problemi con la riassegnazione dei dati.

Se si desidera utilizzare il numero UMat a livello globale per tutti, è possibile che sia presente qualche limitazione con l'uso UMat. E potrebbe essere meglio avere il metodo di riserva con Mat se l'operazione con UMat ha un errore di violazione di accesso.

clearReadyResultImage(); 
qDebug()<<"vpOpenCV::blurImage, try GPU cv::blur"; 
try{ 
    cv::blur(Uimage, UresultImage, cv::Size(ksize, ksize)); 
    UresultImageReady=!UresultImage.empty(); 
} 
catch (cv::Exception& ex) { 
    qWarning()<<"vpOpenCV::blurImage error"<<ex.what(); 
} 
if (!UresultImageReady) { 
    checkReadyImage(); 
    qDebug()<<"vpOpenCV::blurImage, try CPU cv::blur"; 
    try{ 
     cv::blur(image, resultImage, cv::Size(ksize, ksize)); 
     resultImageReady=!resultImage.empty(); 
    } 
    catch (cv::Exception& ex) { 
     qWarning()<<"vpOpenCV::blurImage error"<<ex.what(); 
    } 
} 

... 

void checkReadyImage(){ 
    if (!imageReady && UimageReady){ 
     Uimage.copyTo(image); 
     imageReady=!image.empty(); 
    } 
} 
+0

Potresti spiegare per favore perché errore di violazione di accesso succede quando si usa il metodo .getMat()? – mhaghighat

0

nota che quello che sto descrivendo qui non è una risposta corretta!

Secondo this presentation (a quanto pare una ufficiale dal itseez) il modo corretto per caricare un'immagine da un file direttamente in un cv::UMat dovrebbero essere i seguenti:

UMat img; 
imread("lena.jpg", -1, img); // -1 => CV_LOAD_IMAGE_UNCHANGED (colourwise) 

Tuttavia, questo non fa parte della OpenCV 3 interfaccia, quindi dovresti usare davvero lo Kiran's implementation.

1

Ciò che funziona per me è ...

cv::UMat image; 
cv::imread("image.jpeg", 1).copyTo(image); 

questo sta usando l'ultima OpenCV 3.2