C# OpenCV 강좌 : 제 36강 - HDC
HDC(handle to the Device Context)

영상이나 이미지에서 Graphics와 관련된 장치 컨텍스트에 대한 핸들을 가져와 작업할 수 있습니다.
원본(Source, src)은 영상이나 이미지를 사용합니다.
클래스 코드
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 Project
{
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);
}
}
}세부 코드
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좌표 시작점, 넓이, 높이)를 의미합니다.
hdcgraphics에 roi 크기로 설정합니다.
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))Graphics는 Bitmap에서 작업하므로 bitmap과 grp를 선언합니다.
PixelFormat을 사용하여 색 데이터의 형식을 설정합니다.
IntPtr hdc = grp.GetHdc();
BitmapConverter.DrawToHdc(src, hdc, new CvRect(new CvPoint(0, 0), roi.Size));
grp.ReleaseHdc(hdc);hdc에 Graphics와 관련된 장치 컨텍스트에 대한 핸들을 가져옵니다.
BitmapConverter.DrawToHdc()를 이용하여 HDC를 설정합니다.
BitmapConverter.DrawToHdc(원본, hdc, 크기)입니다.
ReleaseHdc()를 이용하여 핸들을 해제합니다.
grp.DrawString("076923.github.io", new Font("굴림체", 12), Brushes.Red, 5, 5);좌측 모서리에 DrawString을 적용합니다.
hdcgraphics.CopyFrom(bitmap);픽셀 데이터를 IplImage인 hdcgraphics에 적용합니다.
src.ResetROI();src의 ROI를 변경하였으므로 결과를 획득 후 초기화하여 원본과 동일한 형태로 복구시킵니다.
출력 결과

공유하기
Kakao
Naver
Twitter
LinkedIn
Facebook
댓글 남기기