我想使用UMat
,因此我的代码可以使用OpenCL(OpenCV 3.0.0 Beta)在GPU和CPU上运行。
但我找不到将图片文件读取到UMat
或将Mat
转换为UMat
的方法。
如何将图像读入UMat
?
答案 0 :(得分:16)
Mat
到UMat
转换的示例如下。 Coudlnt'为此找到文档。因此,唯一的选择是阅读source。
UMat img = imread( "lena.jpg", IMREAD_COLOR ).getUMat( ACCESS_READ );
source中的不同访问标记
ACCESS_READ, ACCESS_WRITE, ACCESS_RW, ACCESS_FAST
对于未使用的UMat
用法,可以使用完整的人脸检测样本here。另请注意,文档仍将较旧的标志称为imread
第二个参数。您可能需要在OpenCV头文件中使用较新的标志。
答案 1 :(得分:2)
对我有用的是......
cv::UMat image;
cv::imread("image.jpeg", 1).copyTo(image);
这是使用最新的opencv 3.2
答案 2 :(得分:1)
对于隐蔽我使用Uimage.copyTo(image)
或image=Uimage.getMat(cv::ACCESS_READ)
但最后在某些情况下会产生重新分配数据的问题。
如果您希望全局使用UMat
,可以参加使用UMat
的一些限制。如果Mat
的操作有访问冲突错误,可能最好使用UMat
保留方法。
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();
}
}
答案 3 :(得分:0)
请注意,我在这里描述的不是正确答案!
根据this presentation(显然是来自itseez的官方文件),将文件从文件直接加载到cv::UMat
的正确方法应如下:
UMat img;
imread( "lena.jpg", -1, img); // -1 => CV_LOAD_IMAGE_UNCHANGED (colourwise)
但是,这不是OpenCV 3界面的一部分,因此您应该使用Kiran's implementation。
答案 4 :(得分:-2)
您可以使用copyTo
方法将(复制基础数据)cv :: Mat转换为cv :: UMat,反之亦然。
以下是使用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;
}
}