private void ProcessImage(object sender, RoutedEventArgs e) { if (loadedImage == null) { MessageBox.Show("Image needs to be loaded first"); return; } processedImage = loadedImage.Clone(); Emgu.CV.Features2D.Feature2D detector = (Emgu.CV.Features2D.Feature2D)Parameter.ValueFor("Feature Detector", parametersInput.Parameters, parametersInput.Values); MKeyPoint[] kps = detector.Detect(loadedImage.Mat); // TODO: open cv probably has some function to draw features automatically foreach (var kp in kps) { DrawCricle(processedImage, new Bgr(Color.Wheat), new System.Drawing.Point((int)kp.Point.X, (int)kp.Point.Y), new System.Drawing.Size(10, 10)); } Emgu.CV.Util.VectorOfKeyPoint vectorOfKp = new Emgu.CV.Util.VectorOfKeyPoint(kps); var desc = new Emgu.CV.XFeatures2D.BriefDescriptorExtractor(32); Mat descriptors = new Mat(); desc.Compute(loadedImage, vectorOfKp, descriptors); imageViewer.Source = ImageLoader.ImageSourceForBitmap(processedImage.Bitmap); }
private void LoadImage(object sender, RoutedEventArgs e) { loadedImage = ImageLoader.FromFile(); if (loadedImage != null) { imageViewer.Source = ImageLoader.ImageSourceForBitmap(loadedImage.Bitmap); } }
public static void DrawCricles(ImageViewer view, Mat image, MKeyPoint[] points) { var processedImage = image.Clone(); foreach (var kp in points) { DrawCricle(processedImage, new Bgr(Color.Wheat), new System.Drawing.Point((int)kp.Point.X, (int)kp.Point.Y), new System.Drawing.Size(10, 10)); } view.Source = ImageLoader.ImageSourceForBitmap(processedImage.Bitmap); }
public static void DrawFeatures(Mat left, Mat right, MatchingResult match, double takeBest, ImageViewer macthedView) { Mat matchesImage = new Mat(); VectorOfVectorOfDMatch matches2 = new VectorOfVectorOfDMatch(); VectorOfKeyPoint vectorOfKp2 = new VectorOfKeyPoint(match.LeftKps); VectorOfKeyPoint vectorOfKp1 = new VectorOfKeyPoint(match.RightKps); matches2.Push(new VectorOfDMatch(match.Matches.ToArray().OrderBy((x) => x.Distance).Take((int)(match.Matches.Size * takeBest)).ToArray())); // Features2DToolbox.DrawMatches(left, vectorOfKp1, right, vectorOfKp2, matches2, matchesImage, new Bgr(Color.Red).MCvScalar, new Bgr(Color.Blue).MCvScalar); Features2DToolbox.DrawMatches(right, vectorOfKp1, left, vectorOfKp2, matches2, matchesImage, new Bgr(Color.Red).MCvScalar, new Bgr(Color.Blue).MCvScalar); macthedView.Source = ImageLoader.ImageSourceForBitmap(matchesImage.Bitmap); }
private void UdpateFrame(int n) { if (Frames == null || n >= Frames.Count - Step || n < 0) { isRunning = false; nextFrameTimer.Stop(); return; } Dispatcher.BeginInvoke((Action)(() => { currentFrame = n; try { var frame = frames[n]; var frame2 = frames[n + Step]; frame = Undistort(frame); frame2 = Undistort(frame2); var mat = frame.ToImage <Bgr, byte>(); var mat2 = frame2.ToImage <Bgr, byte>(); double maxDistance = MaxDistance(frame); Func <int, int, MatchingResult> matcher = (i1, i2) => { if (!features.TryGetValue(i1, out var features1)) { MatchImagePair.FindFeatures(frames[i1], Detector, Descriptor, out MKeyPoint[] kps1, out Mat desc1); features1 = new MatchingResult() { LeftKps = kps1, LeftDescriptors = desc1 }; } if (!features.TryGetValue(i2, out var features2)) { MatchImagePair.FindFeatures(frames[i2], Detector, Descriptor, out MKeyPoint[] kps2, out Mat desc2); features2 = new MatchingResult() { LeftKps = kps2, LeftDescriptors = desc2 }; } return(MatchImagePair.Match(features1.LeftKps, features1.LeftDescriptors, features2.LeftKps, features2.LeftDescriptors, DistanceType, maxDistance)); }; OdometerFrame odometerFrame = scaler.NextFrame(n, n + Step, matcher); // OdometerFrame odometerFrame = FindTransformation.GetOdometerFrame(mat.Mat, mat2.Mat, Detector, Descriptor, DistanceType, maxDistance, K); if (odometerFrame != null) { videoViewer.Source = ImageLoader.ImageSourceForBitmap(frame.Bitmap); recursive = true; frameProgression.Value = n; recursive = false; frameCurrentLabel.Content = n; totalRotation = odometerFrame.RotationMatrix.Multiply(totalRotation); var rotationEuler = RotationConverter.MatrixToEulerXYZ(totalRotation); totalTranslation = totalTranslation + odometerFrame.Translation; infoComputed.Text = FormatInfo(odometerFrame.Translation, odometerFrame.Rotation, "Comp Diff"); infoComputedCumulative.Text = FormatInfo(totalTranslation, rotationEuler, "Comp Cumulative"); infoK.Text = FormatInfoK(odometerFrame); MatchDrawer.DrawFeatures(mat.Mat, mat2.Mat, odometerFrame.Match, TakeBest, matchedView); } } catch (Exception e) { infoComputed.Text = "Error!"; } if (isRunning) { nextFrameTimer.Start(); } })); }