Esempio n. 1
0
        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);

            using(IntPtrSafeMemoryBox box = new IntPtrSafeMemoryBox())
            {
                box.Value = Handle;
                CxCore.cvReleaseMemStorage(box.Pointer);
            }
        }
Esempio n. 2
0
        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);

            using (IntPtrSafeMemoryBox releasePad = new IntPtrSafeMemoryBox())
            {
                releasePad.Value = Handle;
                HighGui.cvReleaseCapture(releasePad.Pointer);
            }
        }
Esempio n. 3
0
        void DrawSquares(List<CvPoint> squares, PieceInfo[] pieces, HighGuiWindow window)
        {
            using (IplImage cpy = lastFrame.CloneImage())
            {

                StructureSafeMemoryBox<CvPoint> pt = new StructureSafeMemoryBox<CvPoint>(4);
                IntPtrSafeMemoryBox rect = new IntPtrSafeMemoryBox();
                rect.Value = pt.Pointer;
                Int32SafeMemoryBox count = new Int32SafeMemoryBox();
                count.Value = 4;

                for (int i = 0; i < squares.Count; i += 4)
                {
                    pt[0] = squares[i + 0];
                    pt[1] = squares[i + 1];
                    pt[2] = squares[i + 2];
                    pt[3] = squares[i + 3];

                    CvPoint center = new CvPoint((squares[i + 0].x + squares[i + 2].x) / 2,
                        (squares[i + 0].y + squares[i + 2].y) / 2);

                    // CvScalar color = new CvScalar(0, 255, 255);
                    CxCore.cvPolyLine(cpy, rect.Pointer, count.Pointer,
                        1, 1, CvScalar.FromRGB(255, 255, 0), 3, CxCore.CV_AA, 0);
                }

                PieceInfo[,] layout = lastLayout;
                if (layout != null)
                {
                    for (int i = 0; i < 3; i++)
                    {
                        for (int j = 0; j < 3; j++)
                        {
                            pt[0] = new CvPoint(j * 20 + 3, i * 20 + 3);
                            pt[1] = new CvPoint(j * 20 + 3, i * 20 + 18);
                            pt[2] = new CvPoint(j * 20 + 18, i * 20 + 18);
                            pt[3] = new CvPoint(j * 20 + 18, i * 20 + 3);
                            CvScalar color = CvScalar.FromRGB(layout[i, j].color[0], layout[i, j].color[1], layout[i, j].color[2]);
                            CxCore.cvFillPoly(cpy, rect.Pointer, count.Pointer, 1, color, CxCore.CV_AA, 0);
                        }
                    }
                }

                count.Dispose();
                rect.Dispose();
                pt.Dispose();

                window.ShowImage(cpy);
            }
        }
Esempio n. 4
0
        public static List<CvPoint> FindRectangles(IplImage image)
        {
            storage.Clear();

            const int N = 11;
            const int thresh = 50;

            CvSize imageSize = image.Size;
            CvSize evenImageSize = new CvSize(imageSize.width & ~1, imageSize.height & ~1);
            double MinArea = (evenImageSize.height / 12) * (evenImageSize.height / 12);
            double MaxArea = (evenImageSize.height / 4) * (evenImageSize.height / 4);

            List<CvPoint> squares = new List<CvPoint>();

            using (IplImage timg = new IplImage(imageSize, 8, 3),
                gray = new IplImage(evenImageSize, 8, 1),
                pyr = new IplImage(new CvSize(evenImageSize.width / 2, evenImageSize.height / 2), 8, 3))
            {
                Cv.cvCvtColor(image, timg, Cv.CV_BGR2HSV);

                CxCore.cvSetImageROI(timg, new CvRect(new CvPoint(), evenImageSize));

                Cv.cvPyrDown(timg, pyr, 7);
                Cv.cvPyrUp(pyr, timg, 7);
                IplImage tgray = new IplImage(evenImageSize, 8, 1);

                for (int c = 0; c < 3; c++)
                {
                    CxCore.cvSetImageCOI(timg, c + 1);
                    timg.CopyTo(tgray);

                    for (int l = 0; l < N; l++)
                    {
                        if (l == 0)
                        {
                            Cv.cvCanny(tgray, gray, 0, thresh, 5);
                            Cv.cvDilate(gray, gray, IntPtr.Zero, 1);
                        }
                        else
                        {
                            Cv.cvThreshold(tgray, gray, (l + 1) * 255 / N, 255, 0);
                        }

                        CvSeqNavigator contours;
                        using (IntPtrSafeMemoryBox box = new IntPtrSafeMemoryBox())
                        {
                            Cv.cvFindContours(gray, storage, box.Pointer, CvTypeSizes.CvContourSize,
                                Cv.CV_RETR_LIST, Cv.CV_CHAIN_APPROX_SIMPLE, new CvPoint());
                            contours = new CvSeqNavigator(box.Value);
                        }

                        while (!contours.IsEmpty)
                        {
                            IntPtr resultSeq = Cv.cvApproxPoly(contours.Pointer,
                                CvTypeSizes.CvContourSize, storage, Cv.CV_POLY_APPROX_DP,
                                Cv.cvContourPerimeter(contours) * 0.02, 0);

                            CvSeqCollection<CvPoint> result = new CvSeqCollection<CvPoint>(resultSeq, true);
                            if (result.Count == 4)
                            {
                                double area = Math.Abs(Cv.cvContourArea(resultSeq, CvSlice.WholeSeq));
                                if (area >= MinArea && area <= MaxArea &&
                                    Cv.cvCheckContourConvexity(resultSeq) != 0)
                                {
                                    CvPoint[] resultArray = result.ToArray();

                                    double dist1 = Math.Sqrt(CvPoint.Distance2(resultArray[0], resultArray[1]));
                                    double dist2 = Math.Sqrt(CvPoint.Distance2(resultArray[1], resultArray[2]));
                                    double dist3 = Math.Sqrt(CvPoint.Distance2(resultArray[2], resultArray[3]));
                                    double dist4 = Math.Sqrt(CvPoint.Distance2(resultArray[3], resultArray[0]));

                                    bool found = Math.Abs((dist1 - dist3) / (dist1 + dist3)) < 0.1 &&
                                        Math.Abs((dist2 - dist4) / (dist2 + dist4)) < 0.1 &&
                                        Math.Abs((dist1 - dist2) / (dist1 + dist2)) < 0.1;

                                    if (found)
                                    {
                                        for (int i = 0; i < 4; i++)
                                        {
                                            squares.Add(result[i]);
                                        }
                                    }
                                }
                            }

                            contours.Next();
                        }
                    }
                }
            }
            return squares;
        }
Esempio n. 5
0
        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);

            if (ownHandle)
            {
                using (IntPtrSafeMemoryBox releasePad = new IntPtrSafeMemoryBox())
                {
                    releasePad.Value = Handle;
                    CxCore.cvReleaseImage(releasePad.Pointer);
                }
            }
        }