Hello Friends,
I am Shailendra
We want to take an image that is looking at a rectangle from below (creating a trapezoid) and change it into the original rectangle. For example, imagine you were on the ground taking a photograph of a skyscraper. I want to use that data to find what the side of the skyscraper looks like. How can I do that?
Keystone Correction normally refers to an offset projector, but that's not exactly what's happening. My source image is already messed up in the same way as an offset projector would make it. I need to get it straight-on.
We are using CP PLUS IP Camera and we are working in C# dot net application.
Our requirement is to correct image at live view of camera.
Please guide for above problem’s solution.
I have search about it and found following code but its not complete code.
so if any one have complete code then please.
Thank you
What I have tried:
public class LockBitmap
{
Bitmap source = null;
IntPtr Iptr = IntPtr.Zero;
System.Drawing.Imaging.BitmapData bitmapData = null;
public byte[] Pixels { get; set; }
public int Depth { get; private set; }
public int Width { get; private set; }
public int Height { get; private set; }
public void LockBitmap(Bitmap source)
{
this.source = source;
}
public void LockBits()
{
try
{
Width = source.Width;
Height = source.Height;
int PixelCount = Width * Height;
Rectangle rect = new Rectangle(0, 0, Width, Height);
Depth = System.Drawing.Bitmap.GetPixelFormatSize(source.PixelFormat);
if (Depth != 8 && Depth != 24 && Depth != 32)
{
throw new ArgumentException("Only 8, 24 and 32 bpp images are supported.");
}
bitmapData = source.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
source.PixelFormat);
int step = Depth / 8;
Pixels = new byte[PixelCount * step];
Iptr = bitmapData.Scan0;
Marshal.Copy(Iptr, Pixels, 0, Pixels.Length);
}
catch (Exception ex)
{
throw ex;
}
}
public void UnlockBits()
{
try
{
Marshal.Copy(Pixels, 0, Iptr, Pixels.Length);
source.UnlockBits(bitmapData);
}
catch (Exception ex)
{
throw ex;
}
}
public Color GetPixel(int x, int y)
{
Color clr = Color.Empty;
int cCount = Depth / 8;
int i = ((y * Width) + x) * cCount;
if (i > Pixels.Length - cCount)
throw new IndexOutOfRangeException();
if (Depth == 32)
{
byte b = Pixels[i];
byte g = Pixels[i + 1];
byte r = Pixels[i + 2];
byte a = Pixels[i + 3];
clr = Color.FromArgb(a, r, g, b);
}
if (Depth == 24)
{
byte b = Pixels[i];
byte g = Pixels[i + 1];
byte r = Pixels[i + 2];
clr = Color.FromArgb(r, g, b);
}
if (Depth == 8)
{
byte c = Pixels[i];
clr = Color.FromArgb(c, c, c);
}
return clr;
}
public void SetPixel(int x, int y, Color color)
{
int cCount = Depth / 8;
int i = ((y * Width) + x) * cCount;
if (Depth == 32)
{
Pixels[i] = color.B;
Pixels[i + 1] = color.G;
Pixels[i + 2] = color.R;
Pixels[i + 3] = color.A;
}
if (Depth == 24)
{
Pixels[i] = color.B;
Pixels[i + 1] = color.G;
Pixels[i + 2] = color.R;
}
if (Depth == 8)
{
Pixels[i] = color.B;
}
}
}