示例#1
0
    public Scalar getColor()
    {
        if (average.Val0 != -1)
        {
            return(average);
        }
        MatOfByte3 mat3    = new MatOfByte3(data);
        var        indexer = mat3.GetIndexer();

        ArrayList hue   = new ArrayList();
        ArrayList light = new ArrayList();
        ArrayList sat   = new ArrayList();

        for (int y = 0; y < data.Height; y++)
        {
            for (int x = 0; x < data.Width; x++)
            {
                Vec3b color = indexer[y, x];
                hue.Add(color.Item0);
                light.Add(color.Item1);
                sat.Add(color.Item2);
            }
        }
        byte medHue   = getMedian(hue);
        byte medLight = getMedian(light);
        byte medSat   = getMedian(sat);

        average = new Scalar(medHue, medLight, medSat);
        return(average);
    }
示例#2
0
        public void Absdiff_mask(ref Mat dst, Mat src1, Mat src2, Mat mask)
        {
            var indexer1     = new MatOfByte3(src1).GetIndexer();
            var indexer2     = new MatOfByte3(src2).GetIndexer();
            var indexer_mask = new MatOfByte3(mask).GetIndexer();
            var indexer_dst  = new MatOfByte3(dst).GetIndexer();

            for (int x = 0; x < dst.Width; x++)
            {
                for (int y = 0; y < dst.Height; y++)
                {
                    int color1     = indexer1[y, x].Item0;
                    int color2     = indexer2[y, x].Item0;
                    int color_mask = indexer_mask[y, x].Item0;

                    var color = indexer_mask[y, x];
                    if (indexer_mask[y, x].Item0 == 0)//マスク画像の黒領域
                    {
                        color.Item0 = (byte)Math.Abs(color1 - color2);
                    }
                    else
                    {
                        color.Item0 = 0;//白領域は比較しない
                    }
                    indexer_dst[y, x] = color;
                }
            }
            indexer1     = null;
            indexer2     = null;
            indexer_mask = null;
            indexer_dst  = null;
        }
示例#3
0
        public static IList <YoloBoundingBox> ObtainBoundingBoxes(string base64Image)
        {
            var            opencvImage = Image.ConvertFromBase64ToMat(base64Image);
            MatOfByte3     mat3        = new MatOfByte3(opencvImage);
            var            indexer     = mat3.GetIndexer();
            Tensor <float> imageData   = new DenseTensor <float>(new[] { 3, opencvImage.Width, opencvImage.Height });

            for (int y = 0; y < opencvImage.Height; y++)
            {
                for (int x = 0; x < opencvImage.Width; x++)
                {
                    Vec3b color = indexer[y, x];
                    imageData[0, y, x] = (float)color.Item2;
                    imageData[1, y, x] = (float)color.Item1;
                    imageData[2, y, x] = (float)color.Item0;
                }
            }

            var yoloParser      = new YoloParser();
            var resultTransform = imageData.Reshape(new ReadOnlySpan <int>(new[] { 3 * 416 * 416 }));
            var yoloModel       = new YoloModel();
            var results         = yoloModel.Evaluate(new[] { resultTransform });
            var boundingBoxes   = yoloParser.ParseOutputs(results.First().ToArray());

            return(boundingBoxes);
        }
示例#4
0
        public void brightness(ref Mat img, double 目標)
        {
            //中心近くの9ピクセルから輝度調整

            int width = img.Width;
            int height = img.Height;
            int center_x = width / 5;
            int center_y = height / 5;

            double[] vals = new double[9];
            double average = 0;
            double diff = 0;
            var indexer = new MatOfByte3(img).GetIndexer();

            vals[0] = indexer[center_y - 10, center_x - 10].Item0; vals[3] = indexer[center_y - 10, center_x].Item0; vals[6] = indexer[center_y - 10, center_x + 10].Item0;
            vals[1] = indexer[center_y, center_x - 10].Item0; vals[4] = indexer[center_y, center_x].Item0; vals[7] = indexer[center_y, center_x + 10].Item0;
            vals[2] = indexer[center_y + 10, center_x - 10].Item0; vals[5] = indexer[center_y + 10, center_x].Item0; vals[8] = indexer[center_y + 10, center_x + 10].Item0;

            for (int num = 0; num < 9; num++) average += vals[num];
            average = average / 9.0;
            diff = 目標 - average;

            for (int x = 0; x < width; x++)
                for (int y = 0; y < height; y++)
                {
                    Vec3b color = indexer[y, x];
                    double val = color.Item0 + diff;
                    if (val > 255) color.Item0 = 255;
                    else if (val < 0) color.Item0 = 0;
                    else color.Item0 = (byte)val;
                    indexer[y, x] = color;
                }
            indexer = null;
        }
        /// <summary>
        /// 访问像素
        /// </summary>
        public static void AccessPixel()
        {
            using (Mat mat = new Mat("Images/lena.jpg", ImreadModes.Color))
            {
                //bgr格式
                using (MatOfByte3 mat3 = new MatOfByte3(mat))
                {
                    var indexer = mat3.GetIndexer();
                    for (int y = 0; y < mat.Height; y++)
                    {
                        for (int x = 0; x < mat.Width; x++)
                        {
                            Vec3b color = indexer[y, x];
                            byte  temp  = color.Item0;
                            color.Item0   = color.Item2;//B <-- R
                            color.Item2   = temp;
                            indexer[y, x] = color;
                        }
                    }
                }

                using (new Window("window", mat))
                {
                    Cv2.WaitKey();
                }
            }
        }
示例#6
0
        public void コントラスト調整(ref Mat src, double 率)
        {
            int width  = src.Width;
            int height = src.Height;

            var indexer = new MatOfByte3(src).GetIndexer();

            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    Vec3b  color = indexer[y, x];
                    double val   = color.Item0 * 率;
                    if (val > 255)
                    {
                        color.Item0 = 255;
                    }
                    else if (val < 0)
                    {
                        color.Item0 = 0;
                    }
                    else
                    {
                        color.Item0 = (byte)val;
                    }
                    indexer[y, x] = color;
                }
            }
            indexer = null;
        }
示例#7
0
        public static IList <BoundingBox> ObtainBoundingBoxes(string base64Image)
        {
            var opencvImage = Image.ConvertFromBase64ToMat(base64Image);
            var tensor      = new DenseTensor <float>(new int[] { channels, opencvImage.Height, opencvImage.Width });

            using (var mat = new MatOfByte3(opencvImage))
            {
                var indexer = mat.GetIndexer();
                for (int y = 0; y < opencvImage.Height; y++)
                {
                    for (int x = 0; x < opencvImage.Width; x++)
                    {
                        Vec3b color = indexer[y, x];
                        tensor[0, y, x] = (float)color.Item2;
                        tensor[1, y, x] = (float)color.Item1;
                        tensor[2, y, x] = (float)color.Item0;
                    }
                }
            }

            var transform  = tensor.Reshape(new ReadOnlySpan <int>(new[] { channels *opencvImage.Height *opencvImage.Width }));
            var yoloParser = new YoloOutputParser();
            var yoloModel  = YoloModel.Instance;
            var results    = yoloModel.Evaluate(new[] { transform });

            return(yoloParser.ParseOutputs(results.First().ToArray()));
        }
示例#8
0
        /// <summary>
        /// Calculate the Block Mean Value Based Image Perceptual Hash
        /// </summary>
        /// <param name="image">image to hash (OpenCV Mat)</param>
        /// <param name="bits">number of blocks to divide the image by horizontally and vertically</param>
        /// <returns>hash bitstring</returns>
        /// <remarks>
        /// based on blockhash_quick https://github.com/commonsmachinery/blockhash/blob/master/blockhash.c
        /// </remarks>
        /// <seealso cref="http://dx.doi.org/10.1109/IIH-MSP.2006.265125"/>
        private static string BlockHash(Mat image, int bits = 8)
        {
            int x, y, ix, iy;
            int value;
            int block_width;
            int block_height;

            int[] blocks;


            // use smaller image to speedup calculation (default 64x64)
            if (image.Width != 8 * bits || image.Height != 8 * bits)
            {
                var smaller = new OpenCvSharp.Size(8 * bits, 8 * bits);
                var simage  = image.Resize(smaller, 0, 0, InterpolationFlags.Linear);
                simage.CopyTo(image);
                simage.Dispose();
            }


            var image_byte3 = new MatOfByte3(image);
            var indexer     = image_byte3.GetIndexer();

            block_width  = (image.Width) / bits;
            block_height = (image.Height) / bits;

            blocks = new int[bits * bits];

            for (y = 0; y < bits; y++)
            {
                for (x = 0; x < bits; x++)
                {
                    value = 0;

                    for (iy = 0; iy < block_height; iy++)
                    {
                        value = 0;
                        for (ix = 0; ix < block_width; ix++)
                        {
                            var iix = (x * block_width + ix);
                            var iiy = (y * block_height + iy);

                            value += (int)((double)indexer[iiy, iix].Item2 + (double)indexer[iiy, iix].Item1 + (double)indexer[iiy, iix].Item0);
                        }
                    }

                    blocks[y * bits + x] = value;
                }
            }

            var hash = translate_blocks_to_bits(blocks, bits * bits, block_width * block_height);

            //return bits_to_hexhash(hash);
            return(hash);
        }
        public override void Draw(IVncPixelGetter a_pixelGetter, MatOfByte3 a_mat)
        {
            Scalar background = (Scalar)a_pixelGetter.GetPixelVec3b(Background, 0);

            a_mat.Rectangle(new Rect(X, Y, Width, Height), background, -1 /* Fill */);

            foreach (var v in Subrectangle)
            {
                Scalar pixelValue = (Scalar)a_pixelGetter.GetPixelVec3b(v.PixelBinary, 0);
                a_mat.Rectangle(new Rect(X + v.X, Y + v.Y, v.Width, v.Height), pixelValue, -1 /* Fill */);
            }
        }
示例#10
0
        public Vec3b GetPixelColor(Mat image, Point p)
        {
            if (image.Type() != MatType.CV_8UC3)
            {
                throw new ArgumentException("Only CV_8UC3 images are supported...");
            }
            MatOfByte3 mob3    = new MatOfByte3(image);
            var        indexer = mob3.GetIndexer();
            Vec3b      color   = indexer[p.Y, p.X];

            return(color);
        }
示例#11
0
        public static float[] GetArray(this Mat self, float[] buffer = null, bool bgr2rgb = true)
        {
            int width  = self.Width;
            int height = self.Height;

            float[] f;
            if (buffer == null)
            {
                f = new float[width * height * self.Channel];
            }
            else
            {
                if (buffer.Length < width * height * self.Channel)
                {
                    throw new ArgumentOutOfRangeException(nameof(buffer));
                }
                f = buffer;
            }
            using (MatOfByte3 matByte = new MatOfByte3())
            {
                self.CopyTo(matByte);

                var indexer = matByte.GetIndexer();
                int i       = 0;
                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        Vec3b color = indexer[y, x];
                        if (bgr2rgb)
                        {
                            f[i] = color.Item2;
                            i++;
                            f[i] = color.Item1;
                            i++;
                            f[i] = color.Item0;
                            i++;
                        }
                        else
                        {
                            f[i] = color.Item0;
                            i++;
                            f[i] = color.Item1;
                            i++;
                            f[i] = color.Item2;
                            i++;
                        }
                    }
                }
            }

            return(f);
        }
示例#12
0
        // Copies in-memory pixels out of an OpenCV Mat into a PixData that Tesseract / Leptonica understands
        private unsafe void TransferData(MatOfByte3 mat3, PixData pixData)
        {
            var indexer = mat3.GetIndexer();

            for (int y = 0; y < mat3.Height; y++)
            {
                uint *pixLine = (uint *)pixData.Data + (y * pixData.WordsPerLine);
                for (int x = 0; x < mat3.Width; x++)
                {
                    Vec3b color = indexer[y, x];
                    PixData.SetDataFourByte(pixLine, x, BitmapHelper.EncodeAsRGBA(color.Item0, color.Item1, color.Item2, 255));
                }
            }
        }
示例#13
0
        public override void Draw(IVncPixelGetter a_pixelGetter, MatOfByte3 a_mat)
        {
            var indexer  = a_mat.GetIndexer();
            int byteSize = a_pixelGetter.GetPixelByteSize();
            int offset   = m_offset;

            for (int y = Y; y < Y + Height; ++y)
            {
                for (int x = X; x < X + Width; ++x)
                {
                    indexer[y, x] = a_pixelGetter.GetPixelVec3b(m_pixelData, offset);
                    offset       += byteSize;
                }
            }
        }
        public override void Draw(IVncPixelGetter a_pixelGetter, MatOfByte3 a_mat)
        {
            int tile = 0;

            for (int y = Y; y < Y + Height; y += 16)
            {
                int h = (Y + Height - y) > 16 ? 16 : (Y + Height - y);
                for (int x = X; x < X + Width; x += 16)
                {
                    int w = (X + Width - x) > 16 ? 16 : (X + Width - x);
                    Hextile[tile].DrawHexTile(x, y, w, h, a_pixelGetter, a_mat);
                    ++tile;
                }
            }
        }
示例#15
0
        public void 明るさ調整(ref Mat img, double 目標)
        {//中心近くの9ピクセルから輝度調整
            int width    = img.Width;
            int height   = img.Height;
            int center_x = width / 5;
            int center_y = height / 5;

            //var indexer = img.GetGenericIndexer<Vec3b>();

            double[] vals    = new double[9];
            double   average = 0;
            double   diff    = 0;
            var      indexer = new MatOfByte3(img).GetIndexer();

            vals[0] = indexer[center_y - 10, center_x - 10].Item0;  vals[3] = indexer[center_y - 10, center_x].Item0;   vals[6] = indexer[center_y - 10, center_x + 10].Item0;
            vals[1] = indexer[center_y, center_x - 10].Item0;       vals[4] = indexer[center_y, center_x].Item0;        vals[7] = indexer[center_y, center_x + 10].Item0;
            vals[2] = indexer[center_y + 10, center_x - 10].Item0;  vals[5] = indexer[center_y + 10, center_x].Item0;   vals[8] = indexer[center_y + 10, center_x + 10].Item0;

            for (int num = 0; num < 9; num++)
            {
                average += vals[num];
            }
            average = average / 9.0;
            diff    = 目標 - average;

            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    Vec3b  color = indexer[y, x];//indexer[y, x];
                    double val   = color.Item0 + diff;
                    if (val > 255)
                    {
                        color.Item0 = 255;
                    }
                    else if (val < 0)
                    {
                        color.Item0 = 0;
                    }
                    else
                    {
                        color.Item0 = (byte)val;
                    }
                    indexer[y, x] = color;//indexer[y, x] = color;
                }
            }
            indexer = null;
        }
示例#16
0
        private int OCRNumber(Mat skillValue, string name = "")
        {
            if (!string.IsNullOrEmpty(name))
            {
                //skillValue.SaveImage($"{name}.png");
            }
            Pix pix;

            if (skillValue.Type() == MatType.CV_8UC3)
            {
                // 3 bytes
                pix      = Pix.Create(skillValue.Width, skillValue.Height, 32);
                pix.XRes = 72;
                pix.YRes = 72;
                PixData pixData = null;
                try
                {
                    pixData = pix.GetData();
                    MatOfByte3 mat3 = new MatOfByte3(skillValue);
                    TransferData(mat3, pixData);
                }
                catch (Exception)
                {
                    pix.Dispose();
                    //throw;
                    return(0);
                }
            }
            else
            {
                skillValue.SaveImage("temp.png");
                pix = Pix.LoadFromFile("temp.png");
            }

            using (Page resultPage = _tessEngine.Process(pix))
            {
                string data = resultPage.GetText();

                if (int.TryParse(data, out int result))
                {
                    return(result);
                }
            }

            return(0);
        }
示例#17
0
        public static bool[] BrainInputFromMat(Mat mat)
        {
            var byte3Col = new MatOfByte3(mat);
            var indexer  = byte3Col.GetIndexer();
            var pixel    = indexer[0, 1];

            var result = new bool[mat.Height * mat.Width];

            for (int x = 0; x < mat.Width; x++)
            {
                for (int y = 0; y < mat.Height; y++)
                {
                    result[(mat.Width * y) + x] = GetIndexerValue(indexer[y, x]);
                }
            }
            return(result);
        }
示例#18
0
        public void Zero(ref Mat src)
        {
            var indexer = new MatOfByte3(src).GetIndexer();

            for (int x = 0; x < src.Width; x++)
            {
                for (int y = 0; y < src.Height; y++)
                {
                    Vec3b color = indexer[y, x];
                    color.Item0   = 0;
                    color.Item1   = 0;
                    color.Item2   = 0;
                    indexer[y, x] = color;
                }
            }
            indexer = null;
        }
示例#19
0
        public static void GrayScale(Mat mat)
        {
            var mat3    = new MatOfByte3(mat);
            var indexer = mat3.GetIndexer();

            for (int y = 0; y < mat.Height; y++)
            {
                for (int x = 0; x < mat.Width; x++)
                {
                    Vec3b color = indexer[y, x];
                    var   sum   = color.Item0 + color.Item1 + color.Item2;
                    color.Item0   = (byte)(sum / 3);
                    color.Item1   = (byte)(sum / 3);
                    color.Item2   = (byte)(sum / 3);
                    indexer[y, x] = color;
                }
            }
        }
        public Dictionary <string, BitmapSource> SplitColoredQR(Mat combinedMat)
        {
            Dictionary <string, BitmapSource> outputSplitImages = new Dictionary <string, BitmapSource>();
            Size size  = new Size(combinedMat.Width, combinedMat.Height);
            int  depth = combinedMat.Depth();

            Mat redComponent = Mat.Zeros(size, MatType.CV_8UC1);
            Mat grnComponent = Mat.Zeros(size, MatType.CV_8UC1);
            Mat bluComponent = Mat.Zeros(size, MatType.CV_8UC1);

            // Get mat indexers
            MatOfByte3 mobComb = new MatOfByte3(combinedMat);
            MatOfByte  mobRed  = new MatOfByte(redComponent);
            MatOfByte  mobGrn  = new MatOfByte(grnComponent);
            MatOfByte  mobBlu  = new MatOfByte(bluComponent);

            MatIndexer <Vec3b> indexerComb = mobComb.GetIndexer();
            MatIndexer <byte>  indexerRed  = mobRed.GetIndexer();
            MatIndexer <byte>  indexerGrn  = mobGrn.GetIndexer();
            MatIndexer <byte>  indexerBlu  = mobBlu.GetIndexer();

            for (int y = 0; y < combinedMat.Height; y++)
            {
                for (int x = 0; x < combinedMat.Width; x++)
                {
                    // Assign intensity of red channel from the combined mat to the red component mat
                    indexerRed[y, x] = indexerComb[y, x].Item2;

                    // Assign intensity of green channel from the combined mat to the green component mat
                    indexerGrn[y, x] = indexerComb[y, x].Item1;

                    // Assign intensity of blue channel from the combined mat to the blue component mat
                    indexerBlu[y, x] = indexerComb[y, x].Item0;
                }
            }

            outputSplitImages.Add(QR_TYPE_RED_OUT, Utils.MatToImage(redComponent));
            outputSplitImages.Add(QR_TYPE_GREEN_OUT, Utils.MatToImage(grnComponent));
            outputSplitImages.Add(QR_TYPE_BLUE_OUT, Utils.MatToImage(bluComponent));

            return(outputSplitImages);
        }
示例#21
0
        public static void Binarization(Mat mat, float threshold)
        {
            var mat3    = new MatOfByte3(mat);
            var indexer = mat3.GetIndexer();

            var bthreshold = threshold * byte.MaxValue;

            for (int y = 0; y < mat.Height; y++)
            {
                for (int x = 0; x < mat.Width; x++)
                {
                    Vec3b color = indexer[y, x];
                    var   sum   = color.Item0 + color.Item1 + color.Item2;
                    color.Item0   = (byte)(sum / 3) <= bthreshold ? byte.MinValue : byte.MaxValue;
                    color.Item1   = (byte)(sum / 3) <= bthreshold ? byte.MinValue : byte.MaxValue;
                    color.Item2   = (byte)(sum / 3) <= bthreshold ? byte.MinValue : byte.MaxValue;
                    indexer[y, x] = color;
                }
            }
        }
示例#22
0
 /// <summary>
 /// Faster
 /// </summary>
 private void TypeSpecificMat()
 {
     using (Mat mat = new Mat(FilePath.Lenna, LoadMode.Color))
     {
         MatOfByte3 mat3    = new MatOfByte3(mat);
         var        indexer = mat3.GetIndexer();
         for (int y = 0; y < mat.Height; y++)
         {
             for (int x = 0; x < mat.Width; x++)
             {
                 Vec3b color = indexer[y, x];
                 Swap(ref color.Item0, ref color.Item2);
                 indexer[y, x] = color;
             }
         }
         //Cv2.ImShow("TypeSpecificMat", mat);
         //Cv2.WaitKey(0);
         //Cv2.DestroyAllWindows();
     }
 }
示例#23
0
        private Array2D <RgbPixel> ToArray(Mat mat)
        {
            var array = new Array2D <RgbPixel>(mat.Rows, mat.Cols);

            using (var mat3 = new MatOfByte3(mat))
            {
                var indexer = mat3.GetIndexer();
                for (var i = 0; i < array.Rows; i++)
                {
                    var destRow = array[i];
                    for (var j = 0; j < array.Columns; j++)
                    {
                        var color = indexer[i, j];
                        destRow[j] = new RgbPixel(color.Item2, color.Item1, color.Item0);
                    }
                }
            }

            return(array);
        }
    public static Color[] ConvertMatToColorArray(Mat mat)
    {
        var mat3b      = new MatOfByte3(mat);
        var indexer    = mat3b.GetIndexer();
        var width      = mat.Width;
        var heigth     = mat.Height;
        var colorArray = new Color[width * heigth];

        for (var y = 0; y < heigth; y++)
        {
            for (var x = 0; x < width; x++)
            {
                var newColor = new Color();
                newColor.r = indexer[y, x].Item2 / 255.0f;
                newColor.g = indexer[y, x].Item1 / 255.0f;
                newColor.b = indexer[y, x].Item0 / 255.0f;
                colorArray[y * width + x] = newColor;
            }
        }
        return(colorArray);
    }
        public override void Draw(IVncPixelGetter a_pixelGetter, MatOfByte3 a_mat)
        {
            Rect srcRect = new Rect(SrcX, SrcY, Width, Height);
            Rect dstRect = new Rect(X, Y, Width, Height);

            if (srcRect.IntersectsWith(dstRect))
            {
                using (var src = a_mat.Clone(srcRect))
                    using (var dst = new MatOfByte3(a_mat, dstRect))
                    {
                        src.CopyTo(dst);
                    }
            }
            else
            {
                using (var src = new MatOfByte3(a_mat, srcRect))
                    using (var dst = new MatOfByte3(a_mat, dstRect))
                    {
                        src.CopyTo(dst);
                    }
            }
        }
示例#26
0
        public void paint_black(ref Mat src, Mat mask)//maskの白領域をsrcの上に黒塗り
        {
            var indexer_src  = new MatOfByte3(src).GetIndexer();
            var indexer_mask = new MatOfByte3(mask).GetIndexer();

            for (int x = 0; x < src.Width; x++)
            {
                for (int y = 0; y < src.Height; y++)
                {
                    int color_src  = indexer_src[y, x].Item0;
                    int color_mask = indexer_mask[y, x].Item0;

                    var color = indexer_src[y, x];
                    if (indexer_mask[y, x].Item0 != 0)//マスク画像の白領域
                    {
                        color.Item0 = 0;
                    }
                    indexer_src[y, x] = color;
                }
            }
            indexer_src  = null;
            indexer_mask = null;
        }
示例#27
0
        static float[] convert_to_channel_first(Mat mat, float[] offsets)
        {
            var num_pixels = mat.Size().Height *mat.Size().Width;

            float[]    result  = new float[num_pixels * 3];
            MatOfByte3 mat3    = new MatOfByte3(mat);
            var        indexer = mat3.GetIndexer();
            var        pos     = 0;

            for (int y = 0; y < mat.Height; y++)
            {
                for (int x = 0; x < mat.Width; x++)
                {
                    var color = indexer[y, x];
                    result[pos] = color.Item0 - offsets[0];
                    result[pos + num_pixels]     = color.Item1 - offsets[1];
                    result[pos + 2 * num_pixels] = color.Item2 - offsets[2];
                    pos++;
                }
            }
            mat3.Dispose(); mat3 = null;
            return(result);
        }
示例#28
0
        /// <summary>
        /// Convert an image to a 1-dimensional float array. All color frames
        /// are laid out sequentially, one after the other.
        /// </summary>
        /// <param name="mat">The input image as an OpenCv Mat object.</param>
        /// <param name="offsets">Offsets to apply to each color channel.</param>
        /// <returns>An 1-dimensional float array containing the image data.</returns>
        public static float[] FlattenByChannel(Mat mat, float[] offsets)
        {
            var num_pixels = mat.Size().Height *mat.Size().Width;

            float[] result = new float[num_pixels * 3];
            using (MatOfByte3 mat3 = new MatOfByte3(mat))
            {
                var indexer = mat3.GetIndexer();
                var pos     = 0;
                for (int y = 0; y < mat.Height; y++)
                {
                    for (int x = 0; x < mat.Width; x++)
                    {
                        var color = indexer[y, x];
                        result[pos] = color.Item0 - offsets[0];
                        result[pos + num_pixels]     = color.Item1 - offsets[1];
                        result[pos + 2 * num_pixels] = color.Item2 - offsets[2];
                        pos++;
                    }
                }
            }
            return(result);
        }
        public void WriteBackwardBody(MatOfByte3 a_mat, MemoryStream a_output)
        {
            // 12 == x(2) + y(2) + w(2) + h(2) + encodeType(4)
            a_output.Write(BigEndianBitConverter.GetBytes(X), 0, 2);
            a_output.Write(BigEndianBitConverter.GetBytes(Y), 0, 2);
            a_output.Write(BigEndianBitConverter.GetBytes(Width), 0, 2);
            a_output.Write(BigEndianBitConverter.GetBytes(Height), 0, 2);
            a_output.Write(BigEndianBitConverter.GetBytes((Int32)VncEnum.EncodeType.Raw), 0, 4);

            var indexer = a_mat.GetIndexer();

            for (int y = Y; y < Y + Height; ++y)
            {
                for (int x = X; x < X + Width; ++x)
                {
                    var bgr = indexer[y, x];
                    a_output.WriteByte(bgr.Item0);
                    a_output.WriteByte(bgr.Item1);
                    a_output.WriteByte(bgr.Item2);
                    a_output.WriteByte(255);
                }
            }
        }
示例#30
0
        private Mat AlterMat(Mat mat)
        {
            var copy = new Mat();

            mat.CopyTo(copy);

            // Slowest way
            //for (int i = 0; i < copy.Height; i++)
            //{
            //    for (int j = 0; j < copy.Width; j++)
            //    {
            //        var pixel = copy.Get<Vec3b>(i, j);
            //        pixel.Item0 = pixel.Item2;
            //        copy.Set(i, j, pixel);
            //    }
            //}

            // Faster way
            var fasterCopy = new MatOfByte3(mat);
            var indexer    = fasterCopy.GetIndexer();

            for (int row = 0; row < fasterCopy.Height; row++)
            {
                for (int col = 0; col < fasterCopy.Width; col++)
                {
                    var pixel = indexer[row, col];
                    if (50 < pixel.Item2 && pixel.Item2 < 110 && 10 < pixel.Item1 && pixel.Item1 < 100)
                    {
                        pixel.Item2 = 255;
                        pixel.Item1 = 0;
                    }
                    indexer[row, col] = pixel;
                }
            }

            return(fasterCopy);
        }
示例#31
0
        public void 自作反射光除去(Mat[] images, ref Mat DST)
        {
            int width  = images[0].Width;
            int height = images[0].Height;

            MatIndexer <Vec3b>[] indexers = new MatIndexer <Vec3b> [4];
            var indexer = new MatOfByte3(DST).GetIndexer();

            for (int i = 0; i < 4; i++)
            {
                indexers[i] = new MatOfByte3(images[i]).GetIndexer();                        //images[i].GetGenericIndexer<Vec3b>();
            }
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    Vec3b[] colors = new Vec3b[4];
                    Vec3b   color  = indexer[y, x];
                    for (int i = 0; i < 4; i++)
                    {
                        colors[i] = indexers[i][y, x];
                    }
                    double[] vals = { 0, 0, 0, 0 };
                    for (int num = 0; num < 4; num++)
                    {
                        vals[num] = colors[num].Item0;
                    }
                    Array.Sort(vals);//並び替えを行う.min=vals[0]
                    color.Item0   = (byte)((vals[0] + vals[1] + vals[2]) / 3.0);
                    indexer[y, x] = color;

                    colors = null;
                }
            }
            indexers = null;
            indexer  = null;
        }
示例#32
0
        /// <summary>
        /// Draws all blobs to the specified image.
        /// </summary>
        /// <param name="img">The target image to be drawn.</param>
        public void RenderBlobs(Mat img)
        {
            if (img == null) 
                throw new ArgumentNullException("img");
            /*
            if (img.Empty())
                throw new ArgumentException("img is empty");
            if (img.Type() != MatType.CV_8UC3)
                throw new ArgumentException("img must be CV_8UC3");*/
            if (Blobs == null || Blobs.Count == 0)
                throw new OpenCvSharpException("Blobs is empty");
            if (Labels == null)
                throw new OpenCvSharpException("Labels is empty");

            int height = Labels.GetLength(0);
            int width = Labels.GetLength(1);
            img.Create(new Size(width, height), MatType.CV_8UC3);

            Scalar[] colors = new Scalar[Blobs.Count];
            colors[0] = Scalar.All(0);
            for (int i = 1; i < Blobs.Count; i++)
            {
                colors[i] = Scalar.RandomColor();
            }
            
            using (var imgt = new MatOfByte3(img))
            {
                var indexer = imgt.GetIndexer();
                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        int labelValue = Labels[y, x];
                        indexer[y, x] = colors[labelValue].ToVec3b();
                    }
                }
            }
        }
示例#33
0
        public void 自作反射光除去(Mat[] images, ref Mat DST)
        {
            int width = images[0].Width;
            int height = images[0].Height;

            MatIndexer<Vec3b>[] indexers = new MatIndexer<Vec3b>[4];
            var indexer = new MatOfByte3(DST).GetIndexer();

            for (int i = 0; i < 4; i++) indexers[i] = new MatOfByte3(images[i]).GetIndexer();

            for (int x = 0; x < width; x++)
                for (int y = 0; y < height; y++)
                {
                    Vec3b[] colors = new Vec3b[4];
                    Vec3b color = indexer[y, x];
                    for (int i = 0; i < 4; i++) colors[i] = indexers[i][y, x];
                    double[] vals = { 0, 0, 0, 0 };
                    for (int num = 0; num < 4; num++) vals[num] = colors[num].Item0;
                    Array.Sort(vals);//並び替えを行う.min=vals[0]
                    color.Item0 = (byte)((vals[0] + vals[1] + vals[2]) / 3.0);
                    indexer[y, x] = color;

                    colors = null;
                }
            indexers = null;
            indexer = null;
        }
示例#34
0
        /// <summary>
        /// Eye見て傾き検出
        /// </summary>
        /// <param name="srcMat"></param>
        /// <param name="putMat"></param>
        /// <returns></returns>
        public Mat PutEllipseEyeMaskOnFace(Mat srcMat, Mat putMat)
        {
            var grayMat = new Mat();
            Cv2.CvtColor(srcMat, grayMat, ColorConversionCodes.BGR2GRAY);
            Cv2.EqualizeHist(grayMat, grayMat);

            var faces = Cascade.DetectMultiScale(grayMat);

            if (faces == null) return srcMat;

            var polygons = new List<List<Point>>();

            var faceCount = faces.Count(); // O(n)

            for (int d = 0; d < faceCount; d++)
            {
                polygons = new List<List<Point>>();

                int x1 = faces[d].X;
                int y1 = faces[d].Y;
                int width = faces[d].Width;
                int height = faces[d].Height;
                int x2 = x1 + width;
                int y2 = y1 + height;
                int pwidth = putMat.Width;
                int pheight = putMat.Height;
                int srcWidth = srcMat.Width;
                int srcHeight = srcMat.Height;

                polygons.Add(new List<Point>() {
                new Point(x1,y1),
                new Point(x2,y1),
                new Point(x2,y2),
                new Point(x1,y2),
                });

                var faceSize = new Size(width, height);

                //重ねるファイルは少し拡大したほうが良いかな?
                /*                Mat put0 = putMat[(int)(pwidth * 0.1) ,
                                    (int)(pwidth * 0.9),
                                    (int)(pheight * 0.1),
                                    (int)(pheight * 0.9)]
                                    .Resize(new Size(width, heigh), 0, 0, InterpolationFlags.Lanczos4);
                */
                Mat put0 = putMat.Resize(faceSize, 0, 0, InterpolationFlags.Lanczos4);

                //真ん中編の色を適当に抽出
                // 改良の余地あり(肌色領域の平均取ったり?)
                MatOfByte3 mat3 = new MatOfByte3(put0); // cv::Mat_<cv::Vec3b>
                var indexer = mat3.GetIndexer();
                Vec3b color = indexer[(int)(put0.Width * 0.5), (int)(put0.Height * 0.5)];

                //抽出した色で埋める
                Mat put1 = new Mat(srcMat.Size(), MatType.CV_8UC3, new Scalar(color.Item0, color.Item1, color.Item2));

                //重ねる範囲にコピー
                put1[y1, y2, x1, x2] = put0;

                Mat put1gray = Mat.Zeros(srcMat.Size(), MatType.CV_8UC1);
                put1gray[y1, y2, x1, x2] = grayMat[y1, y2, x1, x2];
                var eyes = EyeCascade.DetectMultiScale(put1gray);
                /*
                                Debug.WriteLine(eyes.Count());

                                var cccc = new Point(eyes[0].X + eyes[0].Width * 0.5, eyes[0].Y + eyes[0].Height * 0.5);
                                put1gray.Circle(cccc,(int)(eyes[0].Width * 0.5), new Scalar(0, 255, 255));
                                return put1gray;*/
                var eyeCount = eyes.Count();
                if (eyeCount >= 2)
                {
                    var eyePpints = new List<Point>();

                    var orderedEyes = eyes.OrderByDescending(x => x.Width * x.Height).ToArray();

                    while (true)
                    {
                        for (int i = 0; i < 2; i++)
                        {
                            eyePpints.Add(new Point(eyes[i].X + eyes[i].Width * 0.5, eyes[i].Y + eyes[i].Height * 0.5));
                        }
                        var wrapRect = Cv2.MinAreaRect(eyePpints);
                        if (Math.Abs(wrapRect.Angle % 180) < 20)
                        {
                            var scale = 1.0;
                            var angle = -wrapRect.Angle % 180;

                            var eyedx = (eyePpints[0].X + eyePpints[1].X) * 0.5 - wrapRect.Center.X;
                            var eyedy = (eyePpints[0].Y + eyePpints[1].Y) * 0.5 - wrapRect.Center.Y;

                            //中心はここ
                            var center = new Point(
                                (faces[d].X + faces[d].Width * 0.5) + eyedx,
                                (faces[d].Y + faces[d].Height * 0.5) + eyedy);

                            Mat matrix = Cv2.GetRotationMatrix2D(center, angle, scale);

                            //画像を回転させる
                            Cv2.WarpAffine(put1, put1, matrix, put1.Size());
                            var faceAvgWidth = (int)((wrapRect.Size.Width + faceSize.Width) * 0.6);
                            var rotateRect = new RotatedRect(center, new Size2f(faceAvgWidth, faceSize.Height * 0.9), angle);
                            Mat mask = Mat.Zeros(srcMat.Size(), MatType.CV_8UC3);
                            Cv2.Ellipse(mask, rotateRect, new Scalar(255, 255, 255), -1, LineTypes.AntiAlias);
                            //                Cv2.FillPoly(mask, polygons, new Scalar(255, 255, 255));

                            Cv2.SeamlessClone(put1, srcMat, mask, center, srcMat, SeamlessCloneMethods.NormalClone);
                            break;
                        }
                        else
                        {
                            if (orderedEyes.Count() > 2)
                            {
                                orderedEyes = orderedEyes.Skip(1).ToArray();
                            }
                            else
                            {
                                var angle = 0;

                                //中心はここ
                                var center = new Point(faces[d].X + faces[d].Width * 0.5, faces[d].Y + faces[d].Height * 0.5);
                                var rotateRect = new RotatedRect(center, new Size2f(faceSize.Width * 0.8, faceSize.Height * 0.9), angle);
                                Mat mask = Mat.Zeros(srcMat.Size(), MatType.CV_8UC3);
                                Cv2.Ellipse(mask, rotateRect, new Scalar(255, 255, 255), -1, LineTypes.AntiAlias);
                                //                Cv2.FillPoly(mask, polygons, new Scalar(255, 255, 255));

                                Cv2.SeamlessClone(put1, srcMat, mask, center, srcMat, SeamlessCloneMethods.NormalClone);

                                break;
                            }
                        }
                    }
            }
                else
                {
                    var angle = 0;
                    //中心はここ
                    var center = new Point(faces[d].X + faces[d].Width * 0.5, faces[d].Y + faces[d].Height * 0.5);
                    var rotateRect = new RotatedRect(center, new Size2f(faceSize.Width * 0.8, faceSize.Height * 0.9), angle);
                    Mat mask = Mat.Zeros(srcMat.Size(), MatType.CV_8UC3);
                    Cv2.Ellipse(mask, rotateRect, new Scalar(255, 255, 255), -1, LineTypes.AntiAlias);
                    //                Cv2.FillPoly(mask, polygons, new Scalar(255, 255, 255));
                    Cv2.SeamlessClone(put1, srcMat, mask, center, srcMat, SeamlessCloneMethods.NormalClone);
                }

            }

            return srcMat;
        }
示例#35
0
        /// <summary>
        /// Poisson Image Editing
        /// </summary>
        /// <param name="srcMat">顔がある方</param>
        /// <param name="putMat">重ねる顔</param>
        /// <returns></returns>
        public Mat PutMaskOnFace(Mat srcMat, Mat putMat)
        {
            var grayMat = new Mat();
            Cv2.CvtColor(srcMat, grayMat, ColorConversionCodes.BGR2GRAY);
            Cv2.EqualizeHist(grayMat, grayMat);

            var faces = Cascade.DetectMultiScale(grayMat);

            if (faces == null) return srcMat;

            var binaryMat = new Mat();
            int blockSize = 7;
            double k = 0.15;
            double R = 32;
            Binarizer.Sauvola(grayMat, binaryMat, blockSize, k, R);
            Cv2.BitwiseNot(binaryMat, binaryMat);

            var polygons = new List<List<Point>>();

            var faceCount = faces.Count(); // O(n)

            for (int d = 0; d < faceCount; d++)
            {
                polygons = new List<List<Point>>();

                int x1 = faces[d].X;
                int y1 = faces[d].Y;
                int width = faces[d].Width;
                int heigh = faces[d].Height;
                int x2 = x1 + width;
                int y2 = y1 + heigh;

                polygons.Add(new List<Point>() {
                new Point(x1,y1),
                new Point(x2,y1),
                new Point(x2,y2),
                new Point(x1,y2),
                });

                var pwidth = putMat.Width;
                var pheight = putMat.Height;

                //重ねるファイルは少し拡大したほうが良いかな?
                /*                Mat put0 = putMat[(int)(pwidth * 0.1) ,
                                    (int)(pwidth * 0.9),
                                    (int)(pheight * 0.1),
                                    (int)(pheight * 0.9)]
                                    .Resize(new Size(width, heigh), 0, 0, InterpolationFlags.Lanczos4);
                */
                Mat put0 = putMat.Resize(new Size(width, heigh), 0, 0, InterpolationFlags.Lanczos4);

                //真ん中編の色を適当に抽出
                // 改良の余地あり(肌色領域の平均取ったり?)
                MatOfByte3 mat3 = new MatOfByte3(put0); // cv::Mat_<cv::Vec3b>
                var indexer = mat3.GetIndexer();
                Vec3b color = indexer[(int)(put0.Width * 0.5), (int)(put0.Height * 0.5)];

                //抽出した色で埋める
                Mat put1 = new Mat(srcMat.Size(), MatType.CV_8UC3, new Scalar(color.Item0, color.Item1, color.Item2));

                //重ねる範囲にコピー
                put1[y1, y2, x1, x2] = put0;

                Mat mask = Mat.Zeros(srcMat.Size(), MatType.CV_8UC3);
                Cv2.FillPoly(mask, polygons, new Scalar(255, 255, 255));

                //中心はここ
                var center = new Point(faces[d].X + faces[d].Width * 0.5, faces[d].Y + faces[d].Height * 0.5);
                Cv2.SeamlessClone(put1, srcMat, mask, center, srcMat, SeamlessCloneMethods.NormalClone);
            }
            return srcMat;
        }
示例#36
0
        public Mat PutEllipseMaskOnFace2(Mat srcMat, Mat putMat)
        {
            var grayMat = new Mat();
            Cv2.CvtColor(srcMat, grayMat, ColorConversionCodes.BGR2GRAY);
            Cv2.EqualizeHist(grayMat, grayMat);

            var faces = Cascade.DetectMultiScale(grayMat);

            if (faces == null) return srcMat;

            var binaryMat = new Mat();
            //            binaryMat = ColorExtractor.ExtractMask(srcMat,ColorConversionCodes.BGR2HSV,ColorVariation.Skin);
            //            return binaryMat;

            int blockSize = 7;
            double k = 1.5;
            double R = 100;
            Binarizer.Sauvola(grayMat, binaryMat, blockSize, k, R);

            Cv2.BitwiseNot(binaryMat, binaryMat);
            return binaryMat;

            var polygons = new List<List<Point>>();

            var faceCount = faces.Count(); // O(n)

            for (int d = 0; d < faceCount; d++)
            {
                polygons = new List<List<Point>>();

                int x1 = faces[d].X;
                int y1 = faces[d].Y;
                int width = faces[d].Width;
                int height = faces[d].Height;
                int x2 = x1 + width;
                int y2 = y1 + height;
                int pwidth = putMat.Width;
                int pheight = putMat.Height;
                int srcWidth = srcMat.Width;
                int srcHeight = srcMat.Height;

                polygons.Add(new List<Point>() {
                new Point(x1,y1),
                new Point(x2,y1),
                new Point(x2,y2),
                new Point(x1,y2),
                });

                // f = fixed
                /*                int fx1 = (int)(x1 - width * 0.01);
                                fx1 = fx1 > 0 ? fx1 : 0;

                                int fx2 = (int)(x2 + width * 0.01);
                                fx2 = fx2 < srcWidth ? fx2 : srcWidth;

                                int fy1 = (int)(y1 - height * 0.01);
                                fy1 = fy1 > 0 ? fy1 : 0;

                                int fy2 = (int)(y2 + height * 0.01);
                                fy2 = fy2 < srcHeight ? fy2 : srcHeight;
                                */

                int fx1 = (int)(x1 + width * 0.1);

                int fx2 = (int)(x2 - width * 0.1);

                int fy1 = (int)(y1 + height * 0.1);

                int fy2 = (int)(y2 - height * 0.1);

                int fwidth = x2 - x1;
                int fheight = y2 - y1;

                var faceSize = new Size(fwidth, fheight);

                //重ねるファイルは少し拡大したほうが良いかな?
                /*                Mat put0 = putMat[(int)(pwidth * 0.1) ,
                                    (int)(pwidth * 0.9),
                                    (int)(pheight * 0.1),
                                    (int)(pheight * 0.9)]
                                    .Resize(new Size(width, heigh), 0, 0, InterpolationFlags.Lanczos4);
                */
                Mat put0 = putMat.Resize(faceSize, 0, 0, InterpolationFlags.Lanczos4);

                //真ん中編の色を適当に抽出
                // 改良の余地あり(肌色領域の平均取ったり?)
                MatOfByte3 mat3 = new MatOfByte3(put0); // cv::Mat_<cv::Vec3b>
                var indexer = mat3.GetIndexer();
                Vec3b color = indexer[(int)(put0.Width * 0.5), (int)(put0.Height * 0.5)];

                //抽出した色で埋める
                Mat put1 = new Mat(srcMat.Size(), MatType.CV_8UC3, new Scalar(color.Item0, color.Item1, color.Item2));

                //重ねる範囲にコピー
                put1[y1, y2, x1, x2] = put0;

                Mat mask = Mat.Zeros(srcMat.Size(), MatType.CV_8UC3);

                //中心はここ
                var center = new Point(faces[d].X + faces[d].Width * 0.5, faces[d].Y + faces[d].Height * 0.5);

                Mat faceAroundMat = Mat.Zeros(srcMat.Size(), MatType.CV_8UC1);

                faceAroundMat[fy1, fy2, fx1, fx2] = binaryMat[fy1, fy2, fx1, fx2];

                //                faceAroundMat[y1, y2, x1, x2] = binaryMat[y1, y2, x1, x2];
                //var countours = new
                // 単純な輪郭抽出のみでは、傾きがわからない
                // 元のAPIが破壊的な関数なので clone http://opencv.jp/opencv-2svn/cpp/imgproc_structural_analysis_and_shape_descriptors.html#cv-findcontours
                var contours = faceAroundMat.Clone().FindContoursAsArray(RetrievalModes.List, ContourApproximationModes.ApproxNone);

                //要素数が大きい輪郭だけ
                var detectedContours = contours.Where(c =>
                /*Cv2.ContourArea(c) > Cv2.ContourArea(polygons[0]) * 0.05 &&*/ Cv2.ContourArea(c) < Cv2.ContourArea(polygons[0]) * 0.1);

                Mat conMat = Mat.Zeros(srcMat.Size(), MatType.CV_8UC1);
                Cv2.DrawContours(conMat, detectedContours, -1, new Scalar(255, 255, 255));

                return conMat;

                var points = new List<Point>();
                foreach (var dc in detectedContours)
                {
                    points.Union(dc);
                }
                var detectedRotateRect = Cv2.MinAreaRect(points);

                float angle =
                detectedRotateRect.Angle =
                    Math.Abs(detectedRotateRect.Angle) > 20 ?
                    detectedRotateRect.Angle % 20 :
                    detectedRotateRect.Angle;
                float scale = 1.0f;
                // 回転
                Mat matrix = Cv2.GetRotationMatrix2D(center, angle, scale);

                Debug.WriteLine(detectedRotateRect.Angle);
                //画像を回転させる
                Cv2.WarpAffine(put1, put1, matrix, put1.Size());
                var rotateRect = new RotatedRect(center, new Size2f(faceSize.Width, faceSize.Height), detectedRotateRect.Angle);

                continue;

                Cv2.Ellipse(mask, detectedRotateRect, new Scalar(255, 255, 255), -1, LineTypes.AntiAlias);
                //                Cv2.FillPoly(mask, polygons, new Scalar(255, 255, 255));

                Cv2.SeamlessClone(put1, srcMat, mask, center, srcMat, SeamlessCloneMethods.NormalClone);
            }

            return srcMat;
        }
示例#37
0
        public void 吉岡反射光除去処理(Mat[] images, ref Mat DST,int th_l,int th_h)
        {
            int width = images[0].Width;
            int height = images[0].Height;
            MatIndexer<Vec3b>[] indexers = new MatIndexer<Vec3b>[4];
            var indexer = new MatOfByte3(DST).GetIndexer();

            for (int i = 0; i < 4; i++) indexers[i] = new MatOfByte3(images[i]).GetIndexer();

            for (int x = 0; x < width; x++)
                for (int y = 0; y < height; y++)
                {//medianX,Y SG完成
                    Vec3b[] colors = new Vec3b[4];
                    Vec3b color = indexer[y, x];
                    for (int i = 0; i < 4; i++) colors[i] = indexers[i][y, x];
                    double[] vals = { 0, 0, 0, 0 };
                    for (int num = 0; num < 4; num++) vals[num] = colors[num].Item0;
                    Array.Sort(vals);//並び替えを行う.min=vals[0]
                    for (int i = 1; i < 3; i++)
                    {
                        //if (vals[i] < th_l || vals[i] > th_h) vals[i] = 255;

                        //普通こっちでは?
                        //if (vals[i] < th_l) vals[i] = 0;
                        //if (vals[i] > th_h) vals[i] = 255;

                    }
                    color.Item0 = (byte)((vals[1] + vals[2]) / 2.0);
                    indexer[y, x] = color;

                    colors = null;
                }
            indexers = null;
            indexer = null;
        }
示例#38
0
        public void CvDct(ref Mat DST, Mat SRC, int N)
        {
            Mat dct, idct;
            Mat dct2, dct3;
            int width = SRC.Width;//N;
            int height = SRC.Height;//N;

            DST = SRC.Clone();

            //DCT,IDCT用の行列作成(double)
            dct =  new Mat(height, width, MatType.CV_64FC1);
            idct = new Mat(height, width, MatType.CV_64FC1);

            dct2 = new Mat(height, width, MatType.CV_64FC1);
            dct3 = new Mat(height, width, MatType.CV_64FC1);

            var indexer_DST = new MatOfByte3(DST).GetIndexer();
            var indexer_dct = new MatOfDouble3(dct).GetIndexer();

            //行列dctに画像データをコピー
            //double fcos;
            for (int x = 0; x < width; x++)
                for (int y = 0; y < height; y++)
                {
                    Vec3d color = indexer_dct[y, x];
                    color.Item0= indexer_DST[y, x].Item0 / 256.0;
                    indexer_dct[y,x] = color;
                }
            //DCT…dctをコサイン変換してdct2を作成します
            Cv2.Dct(dct, dct2, DctFlags.None);

            //dct2をDenomで割りdct3を作成します
            PerformDenom(ref dct3, dct2);

            //IDCT…dct3を逆コサイン変換します
            Cv2.Dct(dct3, idct, DctFlags.Inverse);
            var indexer_idct = new MatOfDouble3(idct).GetIndexer();

            //逆変換用画像にデータをコピー
            for (int x = 0; x < width; x++)
                for (int y = 0; y < height; y++)
                {
                    Vec3b color = indexer_DST[y, x];
                    color.Item0=  (byte)(indexer_idct[y,x].Item0 * 256.0);
                    indexer_DST[y,x]=color;
                }

            ////正規化
            //double min, max;
            //min = 4000000000000;
            //max = -4000000000000;
            //double offset = 0.0;

            ////輝度値の最大と最小を取得
            //DST.MinMaxIdx(out min, out max);
            ////for (int x = 0; x < width; x++)
            ////    for (int y = 0; y < height; y++)
            ////    {
            ////        double data = indexer_DST[y,x].Item0;
            ////        if (data < min) min = data;
            ////        if (data > max) max = data;
            ////    }

            //for (int x = 0; x < width; x++)
            //    for (int y = 0; y < height; y++)
            //    {
            //        Vec3b color = indexer_DST[y, x];
            //        double data = indexer_DST[y, x].Item0;

            //        if (data < min + offset) data = min + offset;
            //        color.Item0 = (byte)( (((data / (max - min + offset))) * 255.0) - (((min + offset) / (max - min + offset)) * 255.0) );
            //        indexer_DST[y,x] = color;
            //    }
            ////DST = idct.Clone();

            //行列メモリを開放します
            dct.Dispose();
            dct2.Dispose();
            dct3.Dispose();
            idct.Dispose();

            indexer_dct = null;
            indexer_DST = null;
            indexer_idct = null;
        }
示例#39
0
        public void コントラスト調整_シグモイド(ref Mat src, double 倍率)
        {
            int width = src.Width;
            int height = src.Height;
            var indexer = new MatOfByte3(src).GetIndexer();

            for (int x = 0; x < width; x++)
                for (int y = 0; y < height; y++)
                {
                    Vec3b color = indexer[y, x];
                    color.Item0 = (byte)(255.0 / (1 + Math.Exp(-倍率 * (color.Item0 - 128) / 255)));
                    indexer[y, x] = color;
                }
            indexer = null;
        }
示例#40
0
        public void infilterY(ref Mat DST,Mat SRC)
        {
            int width = SRC.Width;
            int height = SRC.Height;
            DST = SRC.Clone();
            var indexer = new MatOfByte3(DST).GetIndexer();

            for (int x = 0; x < width; x++)
                for (int y = 0; y < height - 1; y++)
                {
                    Vec3b color = indexer[y, x];
                    double val = indexer[y+1, x].Item0 - indexer[y, x].Item0;
                    if (val > 255) color.Item0 = 255;
                    else if (val < 0) color.Item0 = 0;
                    else color.Item0 = (byte)val;
                    indexer[y, x] = color;
                }
            indexer = null;
        }
示例#41
0
        public void コントラスト調整(ref Mat src, double 倍率)
        {
            int width = src.Width;
            int height = src.Height;

            var indexer = new MatOfByte3(src).GetIndexer();

            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    Vec3b color = indexer[y, x];
                    double val = color.Item0 * 倍率;
                    if (val > 255) color.Item0 = 255;
                    else if (val < 0) color.Item0 = 0;
                    else color.Item0 = (byte)val;
                    indexer[y, x] = color;
                }
            }
            indexer = null;
        }
示例#42
0
        public static Mat ExtractMask(Mat srcMat, ColorConversionCodes code,
        int ch1Lower, int ch1Upper,
        int ch2Lower, int ch2Upper,
        int ch3Lower, int ch3Upper)
        {
            if (srcMat == null)
                throw new ArgumentNullException("srcMat");

            var colorMat = srcMat.CvtColor(code);

            var lut = new Mat(256, 1, MatType.CV_8UC3);

            var lower = new int[3] { ch1Lower, ch2Lower, ch3Lower };
            var upper = new int[3] { ch1Upper, ch2Upper, ch3Upper };

            // cv::Mat_<cv::Vec3b>
            var mat3 = new MatOfByte3(lut);

            var indexer = mat3.GetIndexer();

            for (int i = 0; i < 256; i++)
            {
                var color = indexer[i];
                byte temp;

                for (int k = 0; k < 3; k++)
                {

                    if (lower[k] <= upper[k])
                    {
                        if ((lower[k] <= i) && (i <= upper[k]))
                        {
                            temp = 255;
                        }
                        else
                        {
                            temp = 0;
                        }
                    }
                    else
                    {
                        if ((i <= upper[k]) || (lower[k] <= i))
                        {
                            temp = 255;
                        }
                        else
                        {
                            temp = 0;
                        }
                    }

                    color[k] = temp;
                }

                indexer[i] = color;
            }

            Cv2.LUT(colorMat, lut, colorMat);

            var channelMat = colorMat.Split();

            var maskMat = new Mat();

            Cv2.BitwiseAnd(channelMat[0], channelMat[1], maskMat);
            Cv2.BitwiseAnd(maskMat, channelMat[2], maskMat);
            return maskMat;
        }
        private void OnClick実行(object sender, EventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("OnClick実行 開始");
            if (is4Image)
            {

                int width = 入力画像[0].Width;
                int height = 入力画像[0].Height;

                SGx = new OpenCvSharp.Mat(height,width, MatType.CV_8UC1);
                SGy = new OpenCvSharp.Mat(height, width, MatType.CV_8UC1);

                for (int num = 0; num < 4; num++)
                {
                    Gx[num] = 入力画像[num].Clone();
                    Gy[num] = 入力画像[num].Clone();
                }

                for (int num = 0; num < 4; num++)
                {//infilterX,Y
                    mCV.infilterX(ref Gx[num], 入力画像[num]);
                    mCV.infilterY(ref Gy[num], 入力画像[num]);
                }
                mCV.Median(Gx, ref SGx);
                mCV.Median(Gy, ref SGy);

                //Gxxを作る.とりあえず外周1ピクセルやらない方向で.
                Gxx = new OpenCvSharp.Mat(height, width, MatType.CV_8UC1);
                Gyy = new OpenCvSharp.Mat(height, width, MatType.CV_8UC1);

                mCV.infilterX(ref Gxx, SGx);
                mCV.infilterY(ref Gyy, SGy);

                //SP作成(仮の出力画像)
                Mat SP = new OpenCvSharp.Mat(height,width, MatType.CV_8UC1);
                var indexer_sp = new MatOfByte3(SP).GetIndexer();
                var indexer_Gxx= new MatOfByte3(Gxx).GetIndexer();
                var indexer_Gyy = new MatOfByte3(Gyy).GetIndexer();
                for (int x = 0; x < width; x++)
                    for (int y = 0; y < height; y++)
                    {
                        Vec3b color = indexer_sp[y, x];
                        double val = indexer_Gxx[y, x].Item0+ indexer_Gyy[y, x].Item0;
                        if (val > 255) color.Item0 = 255;
                        else if (val < 0) color.Item0 = 0;
                        else color.Item0 = (byte)val;
                        indexer_sp[y, x] = color;

                    }
                indexer_sp  =null;
                indexer_Gxx =null;
                indexer_Gyy = null;

                Mat DCT_dst = new OpenCvSharp.Mat(height, width, MatType.CV_8UC1);
                mCV.CvDct(ref DCT_dst,SP, 1024);//第3引数使われてない件
                //DCT_dst = SP.Clone();
                //mCV.吉岡反射光除去処理(入力画像, ref DCT_dst,int.Parse(textBox_Gaus.Text),int.Parse(textBox_Bright.Text));
                出力画像=DCT_dst.Clone();

            }
            else System.Diagnostics.Debug.WriteLine("no 4 images");
            System.Diagnostics.Debug.WriteLine("OnClick実行 終了");
        }