shimat / opencvsharp

OpenCV wrapper for .NET
Apache License 2.0
5.39k stars 1.15k forks source link

FastNlMeansDenoisingMulti does not work #1402

Closed warren-byoun closed 2 years ago

warren-byoun commented 2 years ago

Summary of your issue

Environment

Visual Studio 2017, OpenCvSharp4 v4.5.5

What did you do when you faced the problem?

I uses Cv2.FastNlMeanDenoising and Cv2.FastNIMeanDenoisingMulti

Cv2.FastNIMeanDenoising works fine. But Cv2.FastNIMeanDenoisingMulti does not.

exception occurs : "Unsupported depth! Only CV_8U is supported for NORM_L2"

MatTypes of input sources are MatType.CV_8UC1 all.

Example code:

public override int Run(ClsImageCollection<Mat> inputImages)
        {
            try
            {
                Mat outMat = new Mat(this.OutputImageHeight, this.OutputImageWidth, MatType.CV_8UC1);
                if (inputImages.Count == 1)
                    Cv2.FastNlMeansDenoising(inputImages[0], outMat, this.h, this.templateWindowSize, this.searchWindowSize);
                else
                {
                    List<Mat> inputs = inputImages.Values.ToList();
                    inputs.ForEach(mat => Trace.WriteLine($"{mat.Depth()}"));

                    Cv2.FastNlMeansDenoisingMulti(inputs, outMat, this.InputCount / 2, this.InputCount, this.h, this.templateWindowSize, this.searchWindowSize);
                }
                _outputImages.Add(0, outMat);
            }
            catch (Exception ex)
            {
                Trace.WriteLine(ex.Message);
                Trace.WriteLine(ex.StackTrace);
                return ClsFilter.NG;
            }
            return ClsFilter.OK;
            //return base.Run(inputImages);
        }

Output:

예외 발생: 'OpenCvSharp.OpenCVException'(OpenCvSharp.dll)
Unsupported depth! Only CV_8U is supported for NORM_L2
   위치: OpenCvSharp.Internal.NativeMethods.<>c.<.cctor>b__1674_0(ErrorCode status, String funcName, String errMsg, String fileName, Int32 line, IntPtr userData)
   위치: OpenCvSharp.Internal.NativeMethods.photo_fastNlMeansDenoisingMulti(IntPtr[] srcImgs, Int32 srcImgsLength, IntPtr dst, Int32 imgToDenoiseIndex, Int32 temporalWindowSize, Single h, Int32 templateWindowSize, Int32 searchWindowSize)
   위치: OpenCvSharp.Cv2.FastNlMeansDenoisingMulti(IEnumerable`1 srcImgs, OutputArray dst, Int32 imgToDenoiseIndex, Int32 temporalWindowSize, Single h, Int32 templateWindowSize, Int32 searchWindowSize)
   위치: OpenCvSharp.Cv2.FastNlMeansDenoisingMulti(IEnumerable`1 srcImgs, OutputArray dst, Int32 imgToDenoiseIndex, Int32 temporalWindowSize, Single h, Int32 templateWindowSize, Int32 searchWindowSize)
   위치: ACE.Imaging.Filter.ClsFilterNLM.Run(ClsImageCollection`1 inputImages) 파일 D:\Work-PlatformLAB\Project\02.ACE\03.Source\ACEProject\ACE\ACE.Imaging\Filter\ClsFilterNLM.cs:줄 85

where 예외 발생 = exception, 위치 = location, 줄 = line

What did you intend to be?

warren-byoun commented 2 years ago

I found it by myself.

Cv2_photo.cs:

    public static void FastNlMeansDenoisingMulti(

        IEnumerable<Mat> srcImgs, OutputArray dst,
        int imgToDenoiseIndex, int temporalWindowSize,
        float h = 3, int templateWindowSize = 7, int searchWindowSize = 21)
    {
        if (srcImgs == null)
            throw new ArgumentNullException(nameof(srcImgs));
        if (dst == null)
            throw new ArgumentNullException(nameof(dst));

      // changed
        dst.ThrowIfNotReady();
        var srcImgPtrs = srcImgs.Select(x => x.CvPtr).ToArray();

        NativeMethods.HandleException(
            NativeMethods.photo_fastNlMeansDenoisingMulti(
                srcImgPtrs, srcImgPtrs.Length, dst.CvPtr,
                imgToDenoiseIndex,
                temporalWindowSize, h, templateWindowSize, searchWindowSize));

        dst.Fix();
        GC.KeepAlive(srcImgs);
        /*
      //previous source
        var srcImgsAsArrays = srcImgs.Select(m => new InputArray(m)).ToArray();
        try
        {
            FastNlMeansDenoisingMulti(srcImgsAsArrays, dst, imgToDenoiseIndex, temporalWindowSize,
                h, templateWindowSize, searchWindowSize);
        }
        finally
        {
            foreach (var img in srcImgsAsArrays)
            {
                img.Dispose();
            }
        }
        */
    }

photo.h in OpenCvSharpExtern

 CVAPI(ExceptionStatus) photo_fastNlMeansDenoisingMulti(cv::Mat ** srcImgs, int srcImgsLength, 
    cv::_OutputArray *dst, int imgToDenoiseIndex, int temporalWindowSize,
   float h, int templateWindowSize, int searchWindowSize)
{
    BEGIN_WRAP

    std::vector<cv::Mat> srcImgsVec;
    for (int i = 0; i < srcImgsLength; i++)
        srcImgsVec.push_back(*srcImgs[i]);

    cv::fastNlMeansDenoisingMulti(srcImgsVec, *dst, imgToDenoiseIndex, temporalWindowSize, h, templateWindowSize, 
          searchWindowSize);

    END_WRAP
}
shimat commented 2 years ago

Thank you for your information!