我有一个框架,并希望使用 openCL 类型 oclMat 将其放在 openCV 的更大图像中。但是下面的代码给了我黑框结果:

capture.read(fMat); // frame from camera or video
oclMat f; f.upload(fMat);
oclMat bf(f.rows*2, f.cols*2, f.ocltype()); // "bf"-big frame
oclMat bfRoi = bf(Rect(0, 0, f.cols, f.rows));
f.copyTo(bfRoi); // something wrong here
// label 1
bf.download(fMat);
Mat bf2; bf.convertTo(bf2, fMat.type()); // this convert affects to nothing
imshow("big frame", bf2);

因此,我必须在“标签1”处添加“oclMat-> Mat”转换,然后返回“Mat-> oclMat”:
Mat fTmp, bfTmp(Size(bf.cols, bf.rows), fMat.type());
f.download(fTmp);
fTmp.convertTo(fTmp, fMat.type()); // it is necessary due to assert(channels() == CV_MAT_CN(dtype))
fTmp.copyTo(bfTmp(Rect(0, 0, fTmp.cols, fTmp.rows)));
bf.upload(bfTmp);

它可以工作,但是要花费太多时间,并且代码看起来很难过。是否可以只在oclMat期限内做同样的事情(不进行正向和反向转换)?

最佳答案

好吧,我一直在搜索错误的位置:operations_on_matrices而不是image_filtering。因此,存在至少一种在ocl中执行此操作的方法-copyMakeBorder(...)。所以我现在的方法是:

capture.read(fMat); // frame from camera or video
oclMat f; f.upload(fMat);
oclMat bf(f.rows*2, f.cols*2, f.ocltype()); // "bf"-big frame from somewhere
// new approach here
oclMat bf2(bf.rows, bf,cols); // temp frame of the same size as big frame
copyMakeBorder(f, bf2, 0, bf2.rows-f.rows, 0, bf2.cols-f.cols, BORDER_CONSTANT, Scalar(0,0,0)); // here it is! any position possible by changing border sizes (remember about mask)
oclMat mask(bf.rows, bf.cols, CV_8UC1); // bw mask to keep part of big frame unchanged
mask = Scalar(0); mask(Range(0, f.rows), Range(0, f.cols)) = Scalar(1); // "draw" rectangle
bf2.copyTo(bf, mask);
// label 1
bf.download(fMat);
imshow("big frame", fMat);

我不确定这是否是最好的方法,但至少可以奏效。

10-08 08:53