C# OpenCV 강좌 : 제 36강 - HDC

   

HDC (handle to the Device Context)


1 영상이나 이미지에서 Graphics와 관련된 장치 컨텍스트에 대한 핸들을 가져와 작업할 수 있습니다.


원본(Source, src)를 영상이나 이미지를 사용하면 됩니다.


영상 사용하기 : 3강 바로가기
이미지 사용하기 : 4강 바로가기


Class


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Drawing.Imaging;
using OpenCvSharp;
using OpenCvSharp.Extensions;


namespace test
{
    class OpenCV : IDisposable
    {
        IplImage hdcgraphics;
            
        public IplImage DrawToHdc(IplImage src)
        {
            CvRect roi = new CvRect(250, 250, 640, 480);
            hdcgraphics = new IplImage(roi.Size, BitDepth.U8, 3);

            src.ROI = roi;
            using (Bitmap bitmap = new Bitmap(roi.Width, roi.Height, PixelFormat.Format32bppArgb))
            using (Graphics grp = Graphics.FromImage(bitmap))
            {
                IntPtr hdc = grp.GetHdc();
                BitmapConverter.DrawToHdc(src, hdc, new CvRect(new CvPoint(0, 0), roi.Size));
                grp.ReleaseHdc(hdc);

                grp.DrawString("076923.github.io", new Font("굴림체", 12), Brushes.Red, 5, 5);

                hdcgraphics.CopyFrom(bitmap);
            }
            src.ResetROI();

            return hdcgraphics;
        }
            
        public void Dispose()
        {
            if (hdcgraphics != null) Cv.ReleaseImage(hdcgraphics);
        }   
    }
}


Class Code


using System.Drawing;
using System.Drawing.Imaging;
using OpenCvSharp.Extensions;

Bitmap 함수를 사용하기 위해서는 네임스페이스using System.Drawing;를 선언해야 사용할 수 있습니다.

PixelFormat를 사용하기 위해서는 네임스페이스using System.Drawing.Imaging;을 선언해야 사용할 수 있습니다.

DrawToHdc()함수를 사용하기 위해서는 네임스페이스 using OpenCvSharp.Extensions;를 선언해야 사용할 수 있습니다.


CvRect roi = new CvRect(250, 250, 640, 480);
hdcgraphics = new IplImage(roi.Size, BitDepth.U8, 3);

CvRect를 이용하여 관심 영역을 설정합니다. new CvRect(x좌표 시작점, y좌표 시작점, 넓이, 높이)를 의미합니다.

hdcgraphicsroi 크기로 설정합니다.


src.ROI = roi;

ROI(Region Of Interest)의 의미는 관심 영역을 의미합니다. src관심영역roi로 설정합니다.


using (Bitmap bitmap = new Bitmap(roi.Width, roi.Height, PixelFormat.Format32bppArgb))
using (Graphics grp = Graphics.FromImage(bitmap))

GraphicsBitmap에서 작업하므로 bitmapgrp를 선언합니다. PixelFormat을 사용하여 색 데이터의 형식을 설정합니다.


IntPtr hdc = grp.GetHdc();
BitmapConverter.DrawToHdc(src, hdc, new CvRect(new CvPoint(0, 0), roi.Size));
grp.ReleaseHdc(hdc);

hdcGraphics와 관련된 장치 컨텍스트에 대한 핸들을 가져옵니다.

BitmapConverter.DrawToHdc()를 이용하여 HDC를 설정합니다. BitmapConverter.DrawToHdc(원본, hdc, 크기)입니다.

ReleaseHdc()를 이용하여 핸들을 해제합니다.


grp.DrawString("076923.github.io", new Font("굴림체", 12), Brushes.Red, 5, 5);

좌측 모서리에 DrawString을 적용합니다.


hdcgraphics.CopyFrom(bitmap);

픽셀 데이터IplImagehdcgraphics에 적용합니다.


src.ResetROI();

srcROI를 변경하였으므로 결과를 획득 후 초기화하여 원본과 동일한 형태로 복구시킵니다.


Result


2



도움이 되셨다면 광고 클릭 부탁드립니다.

⤧  Next post C# OpenCV 강좌 : 제 37강 - 마우스 콜백 ⤧  Previous post C# OpenCV 강좌 : 제 35강 - 변환