我正在研究图像处理项目,我想在其上使用opencv(带有cuda suport的opencv 4.0)在cuda上实现它,我也不擅长c ++。 为了校正两个图像之间的颜色,我正在使用此链接中的代码:(https://answers.opencv.org/question/178127/matching-colors-between-two-pictures-in-opencv/)
我的目标是在GPU上实现此代码。为此,我试图重写该代码。我面临两个问题:
1-为此目的,是否有任何Cuda实现的库? (功能相同)
2-在重写函数((do1ChnHist))中,它暗示了该循环计算1D直方图(是吗?):
for (size_t p = 0; p<img.total(); p++)
{
if (mask(p) > 0)
{
uchar c = img(p);
h(c) += 1.0;
}
}
但是我不能替换为:
int histSize = 256;
float range[] = { 0, 256 }; //the upper boundary is exclusive
const float* histRange = { range };
bool uniform = false, accumulate = false;
calcHist(&img, 1, 0, Mat(), h, 1, &histSize, &histRange, uniform, accumulate);
或使用此循环重写它(用于将来更改Mat >> GpuMat。不幸的是,Opencv_cuda不支持GpuMat _ <>,因为我试图用Mat重写循环)
Mat h;
h = Mat::zeros(cv::Size(256, 1), CV_16U);
uchar x;
for (size_t m = 0; m < img.size().width; m++)
{
for (size_t n = 0; n < img.size().width; n++)
{
x = img.at<int>(Point(m, n));
h.at<int>(Point(int(x),0)) += 1;
}
}
因为两个选项的以太坊从do1ChnHist函数的主循环返回不同的答案... 谢谢...
答案 0 :(得分:-1)
Opencv具有您想要的所有功能
virtual void cv::cuda::TemplateMatching::match ( InputArray image,
InputArray templ,
OutputArray result,
Stream & stream = Stream::Null()
)
void cv::cuda::calcHist (InputArray src, OutputArray hist, Stream &stream=Stream::Null())
Calculates histogram for one channel 8-bit image. More...
void cv::cuda::calcHist (InputArray src, InputArray mask, OutputArray hist, Stream &stream=Stream::Null())
Calculates histogram for one channel 8-bit image confined in given mask. More...
取决于颜色,可能是一维数组,也可能是2D数组。您应该首先学习一些基本的图像处理原理。