Click here to Skip to main content
15,894,405 members
Please Sign up or sign in to vote.
1.00/5 (2 votes)
See more:
Hi
How to plot an image in an inside another larger image using OpenCV?

Thank you
Posted
Updated 19-Sep-12 10:25am
v2

1 solution

This is an example code to plot a small image on to a big image by using C# (for Format8bppIndexed only). I do not use OpenCV, however, you may write your own code in OpenCV with the hint inside this example.

C#
// This is for Format8bppIndexed image. You may write your own if you are using BGR or other formats
        // based on this code example. Good luck!
        private static Bitmap PlotSmallImageOnBigImage(Bitmap bigImage, Bitmap smallImage)
        {
            // Error
            Rectangle r1 = new Rectangle(0, 0, bigImage.Width, bigImage.Height);
            Rectangle r2 = new Rectangle(0, 0, smallImage.Width, smallImage.Height);
            if (r1.Contains(r2) == false)
                throw new Exception("ERROR: small image must be inside the big image.");

            int offsetWidth = (bigImage.Width-smallImage.Width)/2;
            int offsetHeight = (bigImage.Height-smallImage.Height)/2;
            Rectangle rect = new Rectangle(offsetWidth, offsetHeight, smallImage.Width, smallImage.Height);
            BitmapData bigData = bigImage.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed);
            BitmapData smallData=smallImage.LockBits(new Rectangle(0,0, smallImage.Width, smallImage.Height), ImageLockMode.ReadOnly,
                PixelFormat.Format8bppIndexed);

            unsafe
            {
                byte* ptrB = (byte*)(void*)bigData.Scan0;
                int offsetB = bigData.Stride - rect.Width * 1; // see "1", this is for Format8bppIndexed. If BGR it is 3 

                byte* ptrS = (byte*)(void*)smallData.Scan0;               
                int offsetS = smallData.Stride - smallData.Width * 1;
                for (int y = 0; y < rect.Height; y++)
                {
                    for (int x = 0; x < rect.Width; x++)
                    {
                        ptrB[0] = ptrS[0]; // in BGR you may add transparency options here.
                        //ptrB[0] = (byte)((ptrB[0] + ptrS[0])/2);
                        ptrB++;
                        ptrS++;
                    }
                    ptrB += offsetB; // if any
                    ptrS += offsetS;
                }
            }
            bigImage.UnlockBits(bigData);
            smallImage.UnlockBits(smallData);
            return bigImage;
        }
 
Share this answer
 
v2

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900