/// <summary> /// Находит углы в изображении шахматной доски, установленном с помощью SetImage /// </summary> /// <param name="corners">Найденные углы</param> /// <returns>Показывает соответствуют-ли найленные углы шаблону CornersPattern</returns> public bool FindCorners(out CvPoint2D32f[] corners) { bool result; int numCorners; ChessboardFlag flags = ChessboardFlag.AdaptiveThresh | ChessboardFlag.NormalizeImage | ChessboardFlag.FilterQuads; CvTermCriteria criteria = new CvTermCriteria(CriteriaType.Iteration | CriteriaType.Epsilon, MaxIterations, Epsilon); // Находим углы result = chessBoard.FindChessboardCorners(CornersPattern, out corners, out numCorners, flags); // Уточнаем положение углов chessBoard.CvtColor(grayChessBoard, ColorConversion.RgbToGray); grayChessBoard.FindCornerSubPix(corners, corners.Length, new CvSize(11, 11), new CvSize(-1, -1), criteria); return(result); }
/// <summary> /// Finds the positions of internal corners of the chessboard. /// </summary> /// <param name="image">Source chessboard view. It must be an 8-bit grayscale or color image.</param> /// <param name="patternSize">Number of inner corners per a chessboard row and column /// ( patternSize = Size(points_per_row,points_per_colum) = Size(columns, rows) ).</param> /// <param name="corners">Output array of detected corners.</param> /// <param name="flags">Various operation flags that can be zero or a combination of the ChessboardFlag values</param> /// <returns>The function returns true if all of the corners are found and they are placed in a certain order (row by row, left to right in every row). /// Otherwise, if the function fails to find all the corners or reorder them, it returns false.</returns> public static bool FindChessboardCorners( InputArray image, Size patternSize, out Point2f[] corners, ChessboardFlag flags = ChessboardFlag.AdaptiveThresh | ChessboardFlag.NormalizeImage) { if (image == null) throw new ArgumentNullException("image"); image.ThrowIfDisposed(); using (var cornersVec = new VectorOfPoint2f()) { int ret = NativeMethods.calib3d_findChessboardCorners_InputArray( image.CvPtr, patternSize, cornersVec.CvPtr, (int)flags); corners = cornersVec.ToArray(); return ret != 0; } }
/// <summary> /// Finds the positions of internal corners of the chessboard. /// </summary> /// <param name="image">Source chessboard view. It must be an 8-bit grayscale or color image.</param> /// <param name="patternSize">Number of inner corners per a chessboard row and column /// ( patternSize = Size(points_per_row,points_per_colum) = Size(columns, rows) ).</param> /// <param name="corners">Output array of detected corners.</param> /// <param name="flags">Various operation flags that can be zero or a combination of the ChessboardFlag values</param> /// <returns>The function returns true if all of the corners are found and they are placed in a certain order (row by row, left to right in every row). /// Otherwise, if the function fails to find all the corners or reorder them, it returns false.</returns> public static bool FindChessboardCorners( InputArray image, Size patternSize, OutputArray corners, ChessboardFlag flags = ChessboardFlag.AdaptiveThresh | ChessboardFlag.NormalizeImage) { if (image == null) throw new ArgumentNullException("image"); if (corners == null) throw new ArgumentNullException("corners"); image.ThrowIfDisposed(); corners.ThrowIfNotReady(); int ret = NativeMethods.calib3d_findChessboardCorners_InputArray( image.CvPtr, patternSize, corners.CvPtr, (int)flags); corners.Fix(); return ret != 0; }
/// <summary> /// 入力画像がチェスボードパターンであるかどうかを確認し,チェスボードの各コーナーの位置検出を試みる. /// </summary> /// <param name="image">入力のチェスボード画像.8ビットのグレースケールまたはカラー画像.</param> /// <param name="patternSize">チェスボードの行と列ごとのコーナーの数</param> /// <param name="corners">検出されたコーナーの配列. Length=pattern_size.Width*pattern_size.Height</param> /// <param name="cornerCount">コーナーの数が出力される</param> /// <param name="flags">処理フラグ</param> /// <returns>すべてのコーナーが検出され,正しい順番(行順で,かつ各行は左から右に並ぶ)でそれらが配置されている場合には, true</returns> #else /// <summary> /// Finds positions of internal corners of the chessboard /// </summary> /// <param name="image">Source chessboard view; it must be 8-bit grayscale or color image. </param> /// <param name="patternSize">The number of inner corners per chessboard row and column. </param> /// <param name="corners">The output array of corners detected. </param> /// <param name="cornerCount">The output corner counter. If it is not null, the function stores there the number of corners found. </param> /// <param name="flags">Various operation flags</param> /// <returns>returns true if all the corners have been found and they have been placed in a certain order (row by row, left to right in every row), otherwise, if the function fails to find all the corners or reorder them, it returns false. </returns> #endif public static bool FindChessboardCorners(CvArr image, CvSize patternSize, out CvPoint2D32f[] corners, out int cornerCount, ChessboardFlag flags) { if (image == null) { throw new ArgumentNullException("image"); } cornerCount = patternSize.Width * patternSize.Height; corners = new CvPoint2D32f[cornerCount]; using (var cornersPtr = new ArrayAddress1<CvPoint2D32f>(corners)) { int result = NativeMethods.cvFindChessboardCorners(image.CvPtr, patternSize, cornersPtr, ref cornerCount, flags); return result != 0; } }