// // Update // 프레임과 마스크를 업데이트하여 검출상태를 갱신합니다. // // Parameters // source 영역 검출을 위한 행렬입니다. // 이 변수의 엣지를 검출한 뒤에 영역을 구하기 때문에 잡음이 없는 마스크 형식이 가장 이상적입니다. // public void Update(Mat source, isDetectedDelegate callback) { if (source.Type() != MatType.CV_8UC1) { source.ConvertTo(source, MatType.CV_8UC1); } this._detectedRects.Clear(); var edged = source.Canny(this._threshold.Start, this._threshold.End).Dilate(null).Erode(null); var cnts = null as Point[][]; var hierarchy = null as HierarchyIndex[]; edged.FindContours(out cnts, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple); foreach (var c in cnts) { if (Cv2.ContourArea(c) < 100) { continue; } var detectedRect = Cv2.MinAreaRect(c); if (callback(detectedRect) == false) { continue; } this._detectedRects.Add(detectedRect); } }
public void Detect(Mat source, isDetectedDelegate callback) { this.Update(source, callback); var detected = this.DetectedRects.Length != 0; if (this._currentDetected != detected) { this._currentDetected = detected; if (this.OnDetectionStateChanged != null && this.Notification) { this.OnDetectionStateChanged.Invoke(this._currentDetected, this.DetectedRects); } } if (this.DetectedRects.Length != this._currentDetectedCount) { this._currentDetectedCount = this.DetectedRects.Length; if (this.OnDetectionCountChanged != null && this.Notification) { this.OnDetectionCountChanged.Invoke(this.DetectedRects); } } }