그림 이 수평 과 수직 방향 으로 뒤 집 히 는 것 을 실현 합 니 다 (180 도 회전)

4094 단어 【C#】[시각]
카 메 라 는 180 도 회전 합 니 다. 기 존의 알고리즘 을 바 꾸 지 않 기 위해 서 는 그림 을 180 도로 회전 시 키 는 것 이 가장 좋 습 니 다. 그러면 이전에 촬영 한 그림 과 일치 합 니 다.가장 먼저 떠 오 르 는 방법 은 배 슬러 카메라 에 설치 하 는 것 이지 만 리 버스 엑스 만 찾 았 을 뿐 요건 을 충족 하지 못 했다.
왼쪽으로 날 아 가 는 이미지 처리 서 를 찾 아 보고 GDI + 에서 DrawImage 를 기반 으로 반전 을 실현 하 는 방법 을 소개 했다. 해상도 2592 * 1944 의 그림 은 260 ms 가 걸 리 고 너무 느 려 서 이런 방법 은 바람 직 하지 않다.실현 코드 는 다음 과 같다.
        private Bitmap ReverseByDrawImage(Bitmap bitmap)
        {
            System.DateTime begin = System.DateTime.Now;

            Bitmap image = new Bitmap(bitmap.Width, bitmap.Height);
            using (Graphics graphics = Graphics.FromImage(image)) //      FromImage(bitmap),   “                Graphics  。”
            {
                Rectangle Rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
                graphics.DrawImage(bitmap, Rect, Rect, GraphicsUnit.Pixel);
                graphics.Dispose();
            }

            Graphics graphicsRev = Graphics.FromImage(image);

            Point[] VerPoints = { new Point(bitmap.Width, 0), new Point(0, 0), new Point(bitmap.Width, bitmap.Height) };
            graphicsRev.DrawImage(image, VerPoints);

            Point[] HorPoints = { new Point(0, bitmap.Height), new Point(bitmap.Width, bitmap.Height), new Point(0, 0) };
            graphicsRev.DrawImage(image, HorPoints);

            System.DateTime end = System.DateTime.Now;
            TimeSpan duration = end - begin;
            MessageBox.Show("DrawImage Duration time is :" + duration.Milliseconds + " ms");
            return image;
        }

두 번 째 방법 은 메모리 에서 반전 을 실현 하 는 것 입 니 다. 원 리 는 메모리 에서 그림 픽 셀 의 앞 뒤 를 바 꾸 는 것 입 니 다. 이 방법 은 26ms 가 걸 리 고 코드 는 다음 과 같 습 니 다. 
        private unsafe Bitmap ReverseBmpByPtr(Bitmap bitmap)
        {
            System.DateTime begin = System.DateTime.Now;

            Bitmap bitmapClone = (Bitmap)bitmap.Clone();

            int width = bitmap.Width;
            int height = bitmap.Height;

            int length = height * width;
            byte[] Pixels = new byte[length];
            byte[] PixelsClone = new byte[length];

            BitmapData data = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);
            BitmapData dataClone = bitmapClone.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);


            System.IntPtr Scan0 = data.Scan0;
            System.IntPtr Scan0Clone = dataClone.Scan0;

            System.Runtime.InteropServices.Marshal.Copy(Scan0, Pixels, 0, length);
            System.Runtime.InteropServices.Marshal.Copy(Scan0Clone, PixelsClone, 0,length);

            for (int i = 0; i < Pixels.Length; i += 1)
            {
                PixelsClone[i] = Pixels[length-i-1];
            }

            System.Runtime.InteropServices.Marshal.Copy(Pixels, 0, Scan0, length);
            System.Runtime.InteropServices.Marshal.Copy(PixelsClone, 0, Scan0Clone, length);

            bitmap.UnlockBits(data);
            bitmapClone.UnlockBits(dataClone);

            System.DateTime end = System.DateTime.Now;
            TimeSpan duration = end - begin;
            MessageBox.Show("Ptr Duration time is :" + duration.Milliseconds + " ms");
            

            return bitmapClone;
        }

나중에 Bitmap 류 는 그림 과 회전, 뒤 집기 동작 을 지원 하 는 방법 이 있 습 니 다. 속도 가 빠 르 고 15ms 가 걸 립 니 다.
        private Bitmap ReverseBmpByRotateFlip(Bitmap bitmap)
        {
            System.DateTime begin = System.DateTime.Now;

            bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone);
            System.DateTime end = System.DateTime.Now;
            TimeSpan duration = end - begin;
            MessageBox.Show("RotateFlip Duration time is :" + duration.Milliseconds + " ms");
            return bitmap;
        }

Halcon 에서 mirror 테스트 했 습 니 다.image 연산 자, 소요 시간 은 약 13ms 입 니 다.
픽 셀 기반 이미지 처 리 는 메모리 에 넣 어야 합 니 다. 그렇지 않 으 면 너무 느 려 서 GetPixel 과 SetPixel 같은 방법 을 사용 하지 마 십시오.

좋은 웹페이지 즐겨찾기