public Mat MakeSkeleton( [InputPin(Description = "", PropertyMode = PropertyMode.Never)] Mat image ) { if (image.Channels() != 1) { throw new Exception("Input image should be a single channel image."); } Mat img = image.Clone(); Mat skel = Mat.Zeros(img.Size(), MatType.CV_8UC1); Mat temp; Mat eroded; Mat element = OpenCvWrapper.GetStructuringElement(new Size(3, 3), MorphShapes.Cross); bool done; do { eroded = img.Erode(element); temp = eroded.Dilate(element); temp = OpenCvWrapper.Subtract(img, temp); skel = OpenCvWrapper.BitwiseOr(skel, temp); eroded.CopyTo(img); done = (OpenCvWrapper.CountNonZero(img) == 0); } while (!done); return(skel); }
private int GetObjectIndex() { double brightness = OpenCvWrapper.Brightness(workingBitmap); // 이미지 밝기가 충분히 큰 경우, 첫 번째 가짜 객체는 무시한다 return(brightness > minBrightness ? 1 : 0); }
private void ButtonDrawContours_Click(object sender, RoutedEventArgs e) { if (inputSoftwareBitmap != null) { processedImage = inputSoftwareBitmap.ToWriteableBitmap(); OpenCvWrapper.DetectObjects(processedImage, true); OnPropertyChanged("ProcessedImage"); } }
private void ThresholdImage() { if (inputSoftwareBitmap != null) { processedImage = inputSoftwareBitmap.ToWriteableBitmap(); OpenCvWrapper.Threshold(processedImage, thresholdLevel, thresholdType); OnPropertyChanged("ProcessedImage"); } }
private async Task <ObjectDescriptor> FindLargestObject(VideoFrame videoFrame) { if (Dispatcher.HasThreadAccess) { videoFrame.SoftwareBitmap.CopyToBuffer(workingBitmap.PixelBuffer); var objects = OpenCvWrapper.DetectObjects(workingBitmap, false); return(GetLargestObject(objects)); } else { ObjectDescriptor objectDescriptor = null; await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => { objectDescriptor = await FindLargestObject(videoFrame); }); return(objectDescriptor); } }