public HelloWorldPage() : base() { this.GetButton().Opacity = 0; Mat img = new Mat(200, 400, DepthType.Cv8U, 3); //Create a 3 channel image of 400x200 img.SetTo(new Bgr(255, 0, 0).MCvScalar); // set it to Blue color //Draw "Hello, world." on the image using the specific font CvInvoke.PutText( img, "Hello, world", new System.Drawing.Point(10, 80), FontFace.HersheyComplex, 1.0, new Bgr(0, 255, 0).MCvScalar); SetImage(img); }
private void image1_Initialized(object sender, EventArgs e) { Mat image = new Mat(100, 400, DepthType.Cv8U, 3); image.SetTo(new Bgr(255, 255, 255).MCvScalar); CvInvoke.PutText(image, "Hello, world", new System.Drawing.Point(10, 50), Emgu.CV.CvEnum.FontFace.HersheyPlain, 3.0, new Bgr(255.0, 0.0, 0.0).MCvScalar); image1.Source = BitmapSourceConvert.ToBitmapSource(image); }
static void Main(string[] args) { String win1 = "Test Window"; //The name of the window CvInvoke.NamedWindow(win1); //Create the window using the specific name Mat img = new Mat(200, 400, DepthType.Cv8U, 3); //Create a 3 channel image of 400x200 img.SetTo(new Bgr(255, 0, 0).MCvScalar); // set it to Blue color //Draw "Hello, world." on the image using the specific font CvInvoke.PutText( img, "Hello, world", new System.Drawing.Point(10, 80), FontFace.HersheyComplex, 1.0, new Bgr(0, 255, 0).MCvScalar); CvInvoke.Imshow(win1, img); //Show the image CvInvoke.WaitKey(0); //Wait for the key pressing event CvInvoke.DestroyWindow(win1); //Destroy the window if key is pressed }
public static void FindMatch(Mat modelImage, Mat observedImage, out long matchTime, out VectorOfKeyPoint modelKeyPoints, out VectorOfKeyPoint observedKeyPoints, VectorOfVectorOfDMatch matches, out Mat mask, out Mat homography, out long score) { int k = 2; double uniquenessThreshold = 0.80; Stopwatch watch; homography = null; modelKeyPoints = new VectorOfKeyPoint(); observedKeyPoints = new VectorOfKeyPoint(); using (UMat uModelImage = modelImage.GetUMat(AccessType.Read)) using (UMat uObservedImage = observedImage.GetUMat(AccessType.Read)) { KAZE featureDetector = new KAZE(); Mat modelDescriptors = new Mat(); featureDetector.DetectAndCompute(uModelImage, null, modelKeyPoints, modelDescriptors, false); watch = Stopwatch.StartNew(); Mat observedDescriptors = new Mat(); featureDetector.DetectAndCompute(uObservedImage, null, observedKeyPoints, observedDescriptors, false); // KdTree for faster results / less accuracy using (var ip = new Emgu.CV.Flann.KdTreeIndexParams()) using (var sp = new SearchParams()) using (DescriptorMatcher matcher = new FlannBasedMatcher(ip, sp)) { matcher.Add(modelDescriptors); matcher.KnnMatch(observedDescriptors, matches, k, null); mask = new Mat(matches.Size, 1, DepthType.Cv8U, 1); mask.SetTo(new MCvScalar(255)); Features2DToolbox.VoteForUniqueness(matches, uniquenessThreshold, mask); // Calculate score based on matches size // ----------------------------------------------> score = 0; for (int i = 0; i < matches.Size; i++) { if (mask.GetData(i)[0] == 0) { continue; } foreach (var e in matches[i].ToArray()) { ++score; } } // <---------------------------------------------- int nonZeroCount = CvInvoke.CountNonZero(mask); if (nonZeroCount >= 4) { nonZeroCount = Features2DToolbox.VoteForSizeAndOrientation(modelKeyPoints, observedKeyPoints, matches, mask, 1.5, 20); if (nonZeroCount >= 4) { homography = Features2DToolbox.GetHomographyMatrixFromMatchedFeatures(modelKeyPoints, observedKeyPoints, matches, mask, 2); } } } watch.Stop(); } matchTime = watch.ElapsedMilliseconds; }
/// <summary> /// Populates the page with content passed during navigation. Any saved state is also /// provided when recreating a page from a prior session. /// </summary> /// <param name="sender"> /// The source of the event; typically <see cref="NavigationHelper"/>. /// </param> /// <param name="e">Event data that provides both the navigation parameter passed to /// <see cref="Frame.Navigate(Type, Object)"/> when this page was initially requested and /// a dictionary of state preserved by this page during an earlier /// session. The state will be null the first time a page is visited.</param> private async void NavigationHelper_LoadState(object sender, LoadStateEventArgs e) { // TODO: Create an appropriate data model for your problem domain to replace the sample data var item = await SampleDataSource.GetItemAsync((string)e.NavigationParameter); this.DefaultViewModel["Item"] = item; if (item.Title.Equals("Run Hello World")) { Mat img = new Mat(200, 400, DepthType.Cv8U, 3); img.SetTo(new MCvScalar(255, 0, 0)); CvInvoke.PutText(img, "Hello world.", new System.Drawing.Point(10, 80), FontFace.HersheyComplex, 1.0, new MCvScalar(0, 255, 0)); ImageView.Source = img.ToWritableBitmap(); } else if (item.Title.Equals("Run Planar Subdivision")) { Mat img = PlanarSubdivisionExample.DrawSubdivision.Draw(400, 30); ImageView.Source = img.ToWritableBitmap(); } else if (item.Title.Equals("Run Face Detection")) { Mat img = await LoadImage(@"Assets\Images\lena.jpg"); List<Rectangle> faces = new List<Rectangle>(); List<Rectangle> eyes = new List<Rectangle>(); long detectionTime; FaceDetection.DetectFace.Detect(img, "haarcascade_frontalface_default.xml", "haarcascade_eye.xml", faces, eyes, false, false, out detectionTime); foreach (Rectangle face in faces) CvInvoke.Rectangle(img, face, new Bgr(0, 0, 255).MCvScalar, 2); foreach (Rectangle eye in eyes) CvInvoke.Rectangle(img, eye, new Bgr(255, 0, 0).MCvScalar, 2); ImageView.Source = img.ToWritableBitmap(); } else if (item.Title.Equals("Run Pedestrian Detection")) { Mat img = await LoadImage(@"Assets\Images\pedestrian.png"); Mat gray = new Mat(); CvInvoke.CvtColor(img, gray, ColorConversion.Bgr2Gray); long detectionTime; Rectangle[] pedestrians = PedestrianDetection.FindPedestrian.Find(gray, false, false, out detectionTime); foreach (Rectangle pedestrian in pedestrians) { CvInvoke.Rectangle(img, pedestrian, new MCvScalar(0, 0, 255) ); } ImageView.Source = img.ToWritableBitmap(); } }
private void Bayer() { var width = 800; var height = 600; var header = 1024; Mat img = new Mat(height, width, Emgu.CV.CvEnum.DepthType.Cv8U, 1); byte[] data = new byte[height * width]; using (Stream input = new FileStream("Schlittentest.raw", FileMode.Open, FileAccess.Read, FileShare.Read)) { input.Read(data, 0, header); //Skip header input.Read(data, 0, height * width); } img.SetTo(data); Mat rgb = new Mat(); CvInvoke.CvtColor(img, rgb, Emgu.CV.CvEnum.ColorConversion.BayerBg2Rgb); //Setup an own rgb image Mat mine = new Mat(height, width, Emgu.CV.CvEnum.DepthType.Cv8U, 3); byte[] myDat = new byte[3 * height * width]; Func<int, byte> get = (loc) => data[Math.Max(0, Math.Min(data.Length - 1, loc))]; Func<int, byte> myget = (loc) => myDat[Math.Max(0, Math.Min(myDat.Length - 1, loc))]; Func<int, int[], byte> all = (loc, permutations) => (byte) permutations.Average(p => get(loc + p)); Func<int, byte> green = (loc) => all(loc, new int[] { -width, -1, +1, width }); Func<int, byte> redBlue = (loc) => all(loc, new int[] { -width - 1, width + 1, -width + 1, width - 1 }); for (int v = 0; v < height; ++v) { var row = v * width; var rowEven = v % 2 == 0; for (int u = 0; u < width; ++u) { var loc = row + u; var colEven = u % 2 == 0; myDat[3 * loc] = colEven && rowEven ? data[loc] : (!colEven && !rowEven ? redBlue(loc) : (byte)0); myDat[3 * loc + 1] = colEven == rowEven ? green(loc) : data[loc]; myDat[3 * loc + 2] = !colEven && !rowEven ? data[loc] : (colEven && rowEven ? redBlue(loc) : (byte)0); //if (colEven && rowEven) //{ // myDat[3 * loc] = 0; // myDat[3 * loc + 1] = 0; // myDat[3 * loc + 2] = get(loc); //} //else if (!colEven && !rowEven) //{ // myDat[3 * loc] = get(loc); // myDat[3 * loc + 1] = 0; // myDat[3 * loc + 2] = 0; //} //else if (colEven && !rowEven) //{ // myDat[3 * loc] = 0; // myDat[3 * loc + 1] = get(loc); // myDat[3 * loc + 2] = 0; //} //else //{ // myDat[3 * loc] = 0; // myDat[3 * loc + 1] = get(loc); // myDat[3 * loc + 2] = 0; //} //"Perfect" Bayer //if (colEven && rowEven) //{ // myDat[3 * loc] = get(loc); // myDat[3 * loc + 1] = (byte)((get(loc + 1) + get(loc + width)) / 2); // myDat[3 * loc + 2] = get(loc + width + 1); //} //else if (!colEven && !rowEven) //{ // myDat[3 * loc] = get(loc - width - 1); // myDat[3 * loc + 1] = (byte)((get(loc - 1) + get(loc - width)) / 2); // myDat[3 * loc + 2] = get(loc); //} //else if (colEven && !rowEven) //{ // myDat[3 * loc] = get(loc - width); // myDat[3 * loc + 1] = (byte)((get(loc) + get(loc - width + 1)) / 2); // myDat[3 * loc + 2] = get(loc + 1); //} //else //{ // myDat[3 * loc] = get(loc - 1); // myDat[3 * loc + 1] = (byte)((get(loc) + get(loc + width - 1)) / 2); // myDat[3 * loc + 2] = get(loc + width); //} } } for (int v = 0; v < height; ++v) { var row = v * width; var rowEven = v % 2 == 0; for (int u = 0; u < width; ++u) { var loc = row + u; var colEven = u % 2 == 0; if (colEven != rowEven) { myDat[3 * loc] = (byte)new int[]{ -width, -1, +1, width }.Average(p => myget(3*(loc + p))); myDat[3 * loc + 2] = (byte)new int[] { -width, -1, +1, width }.Average(p => myget(3 * (loc + p) + 2)); } } } mine.SetTo(myDat); myImage = mine.Bitmap; opencvImage = rgb.Bitmap; }
private void View3DGlControl_Load(object sender, EventArgs e) { _glLoaded = true; GL.ClearColor(0.0f, 0.0f, 0.0f, 0.0f); SetupViewport(); #region Create texture for the 3D Point clouds int repeat = (int)OpenTK.Graphics.OpenGL.All.Repeat; int linear = (int)OpenTK.Graphics.OpenGL.All.Linear; GL.Enable(EnableCap.CullFace); GL.Enable(EnableCap.Texture2D); _textures = new int[1]; GL.GenTextures(1, _textures); GL.BindTexture(TextureTarget.Texture2D, _textures[0]); GL.TexParameterI(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, ref repeat); GL.TexParameterI(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, ref repeat); GL.TexParameterI(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, ref linear); GL.TexParameterI(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, ref linear); GL.TexEnv(TextureEnvTarget.TextureEnv, TextureEnvParameter.TextureEnvMode, (int)OpenTK.Graphics.OpenGL.All.Decal); GL.ShadeModel(ShadingModel.Smooth); GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest); GL.BindTexture(TextureTarget.Texture2D, 1); Size size = _left.Size; int maxDim = Math.Max(size.Width, size.Height); using (Mat squareImg = new Mat(maxDim, maxDim, DepthType.Cv8U, 3)) { squareImg.SetTo(new MCvScalar()); Rectangle roi = new Rectangle(maxDim / 2 - size.Width / 2, maxDim / 2 - size.Height / 2, size.Width, size.Height); Mat roiImg = new Mat(squareImg, roi); _left.CopyTo(roiImg); if (_texture == null) _texture = new Mat(); CvInvoke.Resize(squareImg, _texture, new Size(256, 256), 0, 0, Emgu.CV.CvEnum.Inter.Cubic); CvInvoke.Flip(_texture, _texture, Emgu.CV.CvEnum.FlipType.Vertical); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgb8, _texture.Width, _texture.Height, 0, PixelFormat.Bgr, PixelType.UnsignedByte, _texture.DataPointer); } #endregion }
//Transform images according to transform matrix // From Line 130-239 public static ReturnColorImg transformColor(Mat img1, Mat mask1, Mat img2, Mat mask2, Mat dst, Mat dst_mask, Point centroid1, Point centroid2, double angle, Point tweak1, Point tweak2, bool mode = true) { Mat E = img2.Clone(); Mat E_mask = mask2.Clone();//Don't ruin original images double intersections = 0; double x = centroid2.X; double y = centroid2.Y; double _x, _y, _y2; double y2; LineSegment2D centerLine = new LineSegment2D(new Point((int)x, (int)y), new Point(img2.Width - (int)x, img2.Height - (int)y)); //Rectangle r=new Rectangle((int)x,(int)y,2*(img2.Width-(int)x),2*(img2.Height-(int)y)); Mat ri = new Mat(2 * (img2.Width - (int)x), 2 * (img2.Height - (int)y),DepthType.Cv8U, 3); ri.SetTo(new MCvScalar(255, 255, 255)); Point oldc = new Point((int)x, (int)y); bool success = false; // if the tweaking is not successful, return false // inverse y axis // y2 = -y; // rotation of centeroid x -= img2.Width / 2; y -= img2.Height / 2;//shift origin to (w/2,h/2) _x = x * Math.Cos(angle / (180 / Math.PI)) - y * Math.Sin(angle / (180 / Math.PI));//rotate by theta _y = x * Math.Sin(angle / (180 / Math.PI)) + y * Math.Cos(angle / (180 / Math.PI)); _x += img2.Width / 2; _y += img2.Height / 2;//back to origin //_x = x+img2.Width/2; //_y = y+img2.Height/2; // inverse y axis //_y = -_y2; centroid2.X = (int)_x; centroid2.Y = (int)_y; Point shift = new Point(); shift.X = centroid1.X - centroid2.X; shift.Y = centroid1.Y - centroid2.Y; MatImage m1 = new MatImage(E); m1.Rotate(angle, new Bgr(255, 255, 255)); E = m1.Out(); MatImage m2 = new MatImage(E_mask); m1.Rotate(angle, new Bgr(255, 255, 255)); E_mask = m2.Out(); //Find optimal size of canvas to hold both images and appropriate transformations Point t1, t2;//transformation 1 and 2 t1 = new Point(); t2 = new Point(); int optimal_h = 0, optimal_w = 0;//of canvas(IplImage* dst) switch (quadrant(shift)) { case 1: t1.X = 0; t1.Y = 0; t2 = shift; optimal_h = Math.Max(img1.Height, img2.Height + shift.Y); optimal_w = Math.Max(img1.Width, img2.Width + shift.X); break; case 2: t1.X = -shift.X; t1.Y = 0; t2.X = 0; t2.Y = shift.Y; optimal_h = Math.Max(img1.Height, img2.Height + shift.Y); optimal_w = Math.Max(img2.Width, img1.Width - shift.X); break; case 3: t1.X = -shift.X; t1.Y = -shift.Y; t2.X = 0; t2.Y = 0; optimal_h = Math.Max(img1.Height - shift.Y, img2.Height); optimal_w = Math.Max(img1.Width - shift.X, img2.Width); break; case 4: t1.X = 0; t1.Y = -shift.Y; t2.X = shift.X; t2.Y = 0; optimal_h = Math.Max(img1.Height - shift.Y, img2.Height); optimal_w = Math.Max(img2.Width + shift.X, img1.Width); break; } // add tweak factor t1.X += tweak1.X; t1.Y += tweak1.Y; t2.X += tweak2.X; t2.Y += tweak2.Y; //optimal_h = 1000; //optimal_w = 1000; dst = new Mat(optimal_h, optimal_w,DepthType.Cv8U,3); dst_mask = new Mat(optimal_h, optimal_w,DepthType.Cv8U,3); if (mode) { dst.SetTo(new MCvScalar(255, 255, 255)); // white background=255, black background=0 } else { dst.SetTo(new MCvScalar(0, 0, 0)); // white background=255, black background=0 } dst_mask.SetTo(new MCvScalar(0, 0, 0)); /*if (BKG_WHITE) cvSet(dst, cvScalar(255));//make it white else cvSet(dst, cvScalar(0));//make it black*/ for (int i = 0; i < img1.Height; ++i) { for (int j = 0; j < img1.Width; ++j) { // if black background if (mode) { if (mask1.GetData(i, j)[0] != 255) { int i_new = i + t1.Y; int j_new = j + t1.X; try { dst.SetValue(i_new, j_new, img1.GetData(i, j)); int[] vals = { 255, 255, 255 }; dst_mask.SetValue(i_new, j_new, vals); } catch(IndexOutOfRangeException e) { //MessageBox.Show("You cannot tweak in that direction further"); success = false; goto ret; } } } // if white background else { if (mask1.GetData(i, j) [0] != 0) { int i_new = i + t1.Y; int j_new = j + t1.X; try { dst.SetValue(i_new, j_new, img1.GetData(i, j)); int[] vals = { 0, 0, 0 }; dst_mask.SetValue(i_new, j_new, vals); } catch(IndexOutOfRangeException e) { //MessageBox.Show("You cannot tweak in that direction further"); success = false; goto ret; } } } } } //Apply transformation to image2 for (int i = 0; i < img2.Height; ++i) { for (int j = 0; j < img2.Width; ++j) { // if black background if (mode) { if (E_mask.GetData(i, j) [0] != 255) { int i_new = i + t2.Y; int j_new = j + t2.X; try { if (dst_mask.GetData(i_new,j_new)[0] != 0) { intersections++; } else { dst.SetValue(i_new, j_new, E.GetData(i, j)); int[] vals = { 255, 255, 255 }; dst_mask.SetValue(i_new, j_new, vals); } } catch (IndexOutOfRangeException e) { //MessageBox.Show("You cannot tweak in that direction further"); success = false; goto ret; } } } // else if white background else { if (E_mask.GetData(i, j)[0] != 0) { int i_new = i + t2.Y; int j_new = j + t2.X; try { if (dst_mask.GetData(i_new, j_new)[0] != 0) { intersections++; } else { dst.SetValue(i_new, j_new, E.GetData(i, j)); int[] vals = { 0, 0, 0 }; dst_mask.SetValue(i_new, j_new, vals); } } catch (IndexOutOfRangeException e) { //MessageBox.Show("You cannot tweak in that direction further"); success = false; goto ret; } } } } } /*for (int i = 0; i < Adst.Length; i++) { for(int j=0; j < Adst[0].Length; j++) { dst.SetValue(i, j, Adst[i][j]); } } for (int i = 0; i < Adst_mask.Length; i++) { for (int j = 0; j < Adst_mask[0].Length; j++) { dst_mask.SetValue(i, j, Adst_mask[i][j]); } }*/ // dst.SetTo(Adst); //dst_mask.SetTo(Adst_mask); success = true; /*cvReleaseImage(&E); cvReleaseImage(&E_mask);*/ // should not need these two lines because of garbage collection // threshold detection is meaningless for 2-piece case, always success ret: if (intersections > Constants.THRESHOLD) { /*cvReleaseImage(&dst);//In case of failure in joining cvReleaseImage(&dst_mask);//release memory*/ ReturnColorImg img = new ReturnColorImg(); img.img = dst; img.img_mask = dst_mask; img.source1 = img1; img.source2 = E_mask; img.center1 = centroid1; img.center2old = oldc; img.center2new = centroid2; img.centerLinee = centerLine; img.returnbool = false; // for determining if the image is matched or not img.translate1 = t1; img.translate2 = t2; img.overlap = intersections; img.success = success; // for tweak only return img; } else { ReturnColorImg img = new ReturnColorImg(); img.img = dst; img.img_mask = dst_mask; img.source1 = img1; img.source2 = E_mask; img.center1 = centroid1; img.center2old = oldc; img.center2new = centroid2; img.centerLinee = centerLine; img.returnbool = true; // for determining if the image is matched or not img.translate1 = t1; img.translate2 = t2; img.overlap = intersections; img.success = success; // for tweak only return img; } }