gpt4 book ai didi

c++ - 在 openCV 中为 oclMat 添加小图像到大图像

转载 作者:行者123 更新时间:2023-11-28 06:55:08 27 4
gpt4 key购买 nike

我有一个框架,想使用 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);

我不确定这是否是最好的方法,但至少它有效。

关于c++ - 在 openCV 中为 oclMat 添加小图像到大图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23281826/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com