How to get color of pixel at mouse click in live video control
-
I have a program which has a control that gets live web cam video feed and plays it on a rectangle in the main form. I have the following code for the control "Mouse_Click" event:
private void videoSourcePlayer_MouseClick(object sender, MouseEventArgs e)
{
txtMouseX.Text = e.X.ToString();
txtMouseY.Text = e.Y.ToString();
}i need to convert the e.X and e.Y to integer format, and use those values in the getPixel function of the bitmap image taken from the video source player in the following code:
private void videoSourcePlayer_NewFrame( object sender, ref Bitmap image )
{bool showOnlyObjects = onlyObjectsCheck.Checked; Bitmap objectsImage = null; objectsImage = image; colorFilter.ApplyInPlace( image ); // lock image for further processing BitmapData objectsData = objectsImage.LockBits( new Rectangle( 0, 0, image.Width, image.Height ), ImageLockMode.ReadOnly, image.PixelFormat ); // grayscaling UnmanagedImage grayImage = grayscaleFilter.Apply( new UnmanagedImage( objectsData ) ); // unlock image objectsImage.UnlockBits( objectsData ); // locate blobs blobCounter.ProcessImage( grayImage ); Rectangle\[\] rects = blobCounter.GetObjectRectangles( ); if ( rects.Length > 0 ) { Rectangle objectRect = rects\[0\]; Graphics g = Graphics.FromImage( image ); using ( Pen pen = new Pen( Color.FromArgb( 160, 255, 160 ), 3 ) ) { //draw something here } g.Dispose( ); } }
how do i get the mouse x and y coordinate values from the first function into the second function so i can use the "image.getPixel()" call?
-
I have a program which has a control that gets live web cam video feed and plays it on a rectangle in the main form. I have the following code for the control "Mouse_Click" event:
private void videoSourcePlayer_MouseClick(object sender, MouseEventArgs e)
{
txtMouseX.Text = e.X.ToString();
txtMouseY.Text = e.Y.ToString();
}i need to convert the e.X and e.Y to integer format, and use those values in the getPixel function of the bitmap image taken from the video source player in the following code:
private void videoSourcePlayer_NewFrame( object sender, ref Bitmap image )
{bool showOnlyObjects = onlyObjectsCheck.Checked; Bitmap objectsImage = null; objectsImage = image; colorFilter.ApplyInPlace( image ); // lock image for further processing BitmapData objectsData = objectsImage.LockBits( new Rectangle( 0, 0, image.Width, image.Height ), ImageLockMode.ReadOnly, image.PixelFormat ); // grayscaling UnmanagedImage grayImage = grayscaleFilter.Apply( new UnmanagedImage( objectsData ) ); // unlock image objectsImage.UnlockBits( objectsData ); // locate blobs blobCounter.ProcessImage( grayImage ); Rectangle\[\] rects = blobCounter.GetObjectRectangles( ); if ( rects.Length > 0 ) { Rectangle objectRect = rects\[0\]; Graphics g = Graphics.FromImage( image ); using ( Pen pen = new Pen( Color.FromArgb( 160, 255, 160 ), 3 ) ) { //draw something here } g.Dispose( ); } }
how do i get the mouse x and y coordinate values from the first function into the second function so i can use the "image.getPixel()" call?
sebogawa wrote:
how do i get the mouse x and y coordinate values from the first function into the second function
Short answer, you can't! Judging from its signature, your
videoSourcePlayer_NewFrame
method is an event handler for the video player you are using. Its parameters are fixed and interfering with then will break the code. One possible solution is to make theUnmanagedImage grayImage
declaration a class field (Move the declaration outside the handler), then in yourMouseClick
handler do something likeprivate void videoSourcePlayer_MouseClick(object sender, MouseEventArgs e)
{
txtMouseX.Text = e.X.ToString();
txtMouseY.Text = e.Y.ToString();// Either Color selectedColor = grayImage.GetPixel(e.X, e.Y); // do stuff with selectedColor here // OR SomeMethodThatUsesTheColor(grayImage.GetPixel(e.X, e.Y));
}
Your biggest problem might turn out to depend on how quickly the
grayImage
changes.Henry Minute Do not read medical books! You could die of a misprint. - Mark Twain Girl: (staring) "Why do you need an icy cucumber?" “I want to report a fraud. The government is lying to us all.”
-
I have a program which has a control that gets live web cam video feed and plays it on a rectangle in the main form. I have the following code for the control "Mouse_Click" event:
private void videoSourcePlayer_MouseClick(object sender, MouseEventArgs e)
{
txtMouseX.Text = e.X.ToString();
txtMouseY.Text = e.Y.ToString();
}i need to convert the e.X and e.Y to integer format, and use those values in the getPixel function of the bitmap image taken from the video source player in the following code:
private void videoSourcePlayer_NewFrame( object sender, ref Bitmap image )
{bool showOnlyObjects = onlyObjectsCheck.Checked; Bitmap objectsImage = null; objectsImage = image; colorFilter.ApplyInPlace( image ); // lock image for further processing BitmapData objectsData = objectsImage.LockBits( new Rectangle( 0, 0, image.Width, image.Height ), ImageLockMode.ReadOnly, image.PixelFormat ); // grayscaling UnmanagedImage grayImage = grayscaleFilter.Apply( new UnmanagedImage( objectsData ) ); // unlock image objectsImage.UnlockBits( objectsData ); // locate blobs blobCounter.ProcessImage( grayImage ); Rectangle\[\] rects = blobCounter.GetObjectRectangles( ); if ( rects.Length > 0 ) { Rectangle objectRect = rects\[0\]; Graphics g = Graphics.FromImage( image ); using ( Pen pen = new Pen( Color.FromArgb( 160, 255, 160 ), 3 ) ) { //draw something here } g.Dispose( ); } }
how do i get the mouse x and y coordinate values from the first function into the second function so i can use the "image.getPixel()" call?
Thank you for the help Henry. I was wondering if the videosourcePlayer_NewFrame can inherit the videoSourcePlayer_MouseClick values and apply them to the _NewFrame block? I have been playing around with basic inheritance but involves only classes. I stunbled upon a C# lesson involving polymorphism (inheriting from a method) at the following link: http://www.softsteel.co.uk/tutorials/cSharp/lesson14.html[^] Do you think this will help? If not then how can i solve my problem, detaching the greyimage declaration and applying it to mouse click does nothing due to the fact that the greyImage can not be changed. I am trying to make it so that when i click on the live video feed control, it takes the ARGB values of the pixel clicked on (plus or minus 30) and apply it to the ARGB filter textboxes which saturates the image to only show the given color. (color tracking) the purpose of this app is for a robot that i am working on that tracks while traffic lines, 3 inches thick which the robot must stay in between. I am using webcams, and the AForge library for video processing and I scrapped together pieces of the "Lego Pan and Tilt App" from a Code Project Article. The app works but i have to manually set all the ARGB ranges to find the color i want. It would be easier to just click on the image and get the values. I hope this information helps, im stuck and at a loss for ideas. Any help would be greatly appreciated. :-D
modified on Tuesday, April 21, 2009 3:11 PM