在opencv3.3中我在使用fastNlMeansDenoisingMulti()
我发现说函数 当输入的参数是NORM_L1 支持U16类型的图像输入格式
但是在实际使用中一直在报错 说"Unsupported image format! Only CV_8U, CV_8UC2, CV_8UC3 and CV_8UC4 are supported"
于是乎我就看了下opencv photo mudule中的代码,在denoising.cpp中
我发现在fastNlMeansDenoisingMulti()中支持这个类型
case NORM_L1:
switch (depth) {
case CV_8U:
fastNlMeansDenoisingMulti_<uchar, int, unsigned,
DistAbs>(srcImgs, dst,
imgToDenoiseIndex, temporalWindowSize,
h,
templateWindowSize, searchWindowSize);
break;
case CV_16U:
printf("NLM multi U16\n");
fastNlMeansDenoisingMulti_<ushort, int64, uint64,
DistAbs>(srcImgs, dst,
imgToDenoiseIndex, temporalWindowSize,
h,
templateWindowSize, searchWindowSize);
但是在转入fastNlMeansDenoisingMulti_()函数后
switch (srcImgs[0].type())
{
case CV_8U:
...
case CV_8UC2:
...
case CV_8UC3:
...
case CV_8UC4:
...
default:
CV_Error(Error::StsBadArg,
"Unsupported image format! Only CV_8U, CV_8UC2, CV_8UC3 and CV_8UC4 are supported");
所以应该是在这个函数中没有实现对CV_16U的支持
于是我在line266添加了以下内容
case CV_16U:
parallel_for_(cv::Range(0, srcImgs[0].rows),
FastNlMeansMultiDenoisingInvoker<ushort, IT, UIT, D, int>(
srcImgs, imgToDenoiseIndex, temporalWindowSize,
dst, templateWindowSize, searchWindowSize, &h[0]),
granularity);
break;
重新编译了opencv_world330d.lib opencv_world330d.dll opencv_world330.lib opencv_world330.dll
现在就可以愉快的使用新功能啦~