Как рассчитать "Арктан" и "Пау" IplImage?

Я пытаюсь рассчитать величину градиента и ориентацию изображения в градациях серого с помощью OpenCvSharp. Проблема в том, что функция "Pow" не подходит для IplImage. Я также хочу знать, как я могу рассчитать tan-1 (или arctan) для FeatureImage. Спасибо

        using (IplImage cvImage = new IplImage("grayImage.png", LoadMode.AnyDepth | 
                LoadMode.GrayScale))
        using (IplImage dstXImage = new IplImage(cvImage.Size, cvImage.Depth, cvImage.NChannels))
        using (IplImage dstYImage = new IplImage(cvImage.Size, cvImage.Depth, cvImage.NChannels))
        {
            float[] data = {    0, -1, -1, 2    };
            CvMat kernel = new CvMat(2, 2, MatrixType.F32C1, data);

            Cv.Sobel(cvImage, dstXImage, 1, 0, ApertureSize.Size1);
            Cv.Sobel(cvImage, dstYImage, 0, 1, ApertureSize.Size1);

            Cv.Normalize(dstXImage, dstXImage, 1.0, 0, NormType.L1);
            Cv.Filter2D(cvImage, dstXImage, kernel, new CvPoint(0, 0));

            Cv.Normalize(dstYImage, dstYImage, 1.0, 0, NormType.L1);
            Cv.Filter2D(cvImage, dstYImage, kernel, new CvPoint(0, 0));

            // to calculate gradient magnitude, sqrt[(dy)power 2  +  (dx)power 2]
            dstXImage.Mul(dstXImage, dstXImage);
            dstYImage.Mul(dstYImage, dstYImage);
            IplImage dstXYImage = new IplImage(cvImage.Size, cvImage.Depth, cvImage.NChannels);
            dstXImage.Add(dstYImage, dstXYImage);
            dstXYImage.Pow(dstXYImage, 1/2); //this line not working,output image is black page


            // to calculate gradient orientation, arctan(dy/dx)
            IplImage thetaImage = new IplImage(cvImage.Size, cvImage.Depth, cvImage.NChannels);
            dstYImage.Div(dstXImage, thetaImage); //afterwards need help to calculate arctan 


            using (new CvWindow("SrcImage", cvImage))
            using (new CvWindow("DstXImage", dstXImage))
            using (new CvWindow("DstYImage", dstYImage))
            using (new CvWindow("DstXYImage", dstXYImage))
            using (new CvWindow("thetaImage", thetaImage))

            {
                Cv.WaitKey(0);
            }

1 ответ

Вы можете использовать функцию cartToPolar для ваших целей. Эта функция вычисляет величину и угол двухмерных векторов.

величина (I)= sqrt(x(I)^2+y(I)^2), угол (I)= atan2(y(I), x(I))[ *180 / pi ]

Например:

IplImage dstXYImage;
IplImage thetaImage;
CartToPolar(dstXImage, dstYImage, dstXYImage, thetaImage, true);
Другие вопросы по тегам