protected override void Dispose(bool disposing) { base.Dispose(disposing); using(IntPtrSafeMemoryBox box = new IntPtrSafeMemoryBox()) { box.Value = Handle; CxCore.cvReleaseMemStorage(box.Pointer); } }
protected override void Dispose(bool disposing) { base.Dispose(disposing); using (IntPtrSafeMemoryBox releasePad = new IntPtrSafeMemoryBox()) { releasePad.Value = Handle; HighGui.cvReleaseCapture(releasePad.Pointer); } }
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); } }
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; }
protected override void Dispose(bool disposing) { base.Dispose(disposing); if (ownHandle) { using (IntPtrSafeMemoryBox releasePad = new IntPtrSafeMemoryBox()) { releasePad.Value = Handle; CxCore.cvReleaseImage(releasePad.Pointer); } } }