김용유닷컴

블로그 이미지

희자매(가희나희)아빠

잡다한 지식, 엉뚱한 생각들, 내 맘대로 사진, 프로그램 개발 이야기 등등을 저장하기 위해 만들어 놓은 개인 블로그입니다. 문의나 요청은 늦게라도 받겠으나 악플이나 욕설은 정중히 사양하겠습니다.

OpenCV에서의 한글(Unicode) 출력 관련해서..

1.소프트웨어 이야기/02.Vision(Image Processing) 2010. 8. 16. 18:38
OpenCV에서 한글 출력과 관련해서 웹에서 찾아보니.. Conv2 님의 블로그에 보니 함수를 직접 만들어 사용하는 법이 나와 있었다.

정지 영상에서는 아무 문제없이 잘 되는 듯해서 사용하고 있었는데, 이것을 실시간 동영상으로 받아서 처리하다보니.. 메모리가 새는 문제가 있었다. (GDI증가.. 메모리 증가... 그러다가.. 다운... ㅠㅠ)
 Conv2님은 그대로 사용하지 말라고 했으나, 경고를 무시한 나의 잘못이니.. 그래서.. 직접 수정하기로 했다..

Conv2님의 설명은 아래 링크를 따라 가면 된다..
"conv2「 함수를 탓하기 보다는 직접 만드는 게 어떨까? 」"

수정해서 나온 코드는 아래와 같다..
* 헤더 부분

// Open CV 한글 출력용 함수
void setPutText(IplImage * src_image, /* 원영상 */
IplImage *dst_image,  /* 저장할 영상 */
char * text, /* 텍스트 */
CvPoint textPos, /* 텍스트 위치 */
CvScalar color); /* 텍스트 색상 */
HBITMAP setTextToBitmap(char* text, CvScalar color); // Text To Bitmap
IplImage * setBitmapToIplImage(HBITMAP hBitmap); // Bitmap to IplImage


* 소스부분

// OpenCV에서 한글 출력을 위해 추가함..
// 한글 출력을 위해 만든 함수 
void CGlobal::setPutText(IplImage * src_image, // 원영상
 IplImage *dst_image, // 저장 영상
 char * text, // 텍스트 
 CvPoint textPos, // 텍스트 위치
 CvScalar color) // 텍스트 색상 
{
if(src_image->nChannels == 1) // 명암도 영상일때
cvCvtPlaneToPix(src_image, src_image, src_image, NULL, dst_image);
else if(src_image->nChannels != 1) // 컬러 영상일때
cvCopy(src_image, dst_image);

int width = src_image->width;
int height = src_image->height;

// 범위 초과시 처리.
if( (textPos.y > src_image->height) || (textPos.x > src_image->width) )// 텍스트 크기가 그림 크기보다 크다면..
{
cvCopy(src_image, dst_image);
}
// 메모리 증가하는 문제 수정할 것...
CvScalar var = {0,0,0,0};
HBITMAP hBitmap = setTextToBitmap(text, color); // Text to Bimap
IplImage * text_image = setBitmapToIplImage(hBitmap); // Bitmap to IplImage

// 텍스트 영상을 관심영역으로 간주.
for(int nRow = textPos.y; nRow < (textPos.y + text_image->height); nRow++)
{
for(int nCol = textPos.x; nCol < (textPos.x + text_image->width); nCol++)
{ 
if(nRow >= height || nCol >= width) continue;
var = cvGet2D(text_image, nRow - textPos.y, nCol - textPos.x);

if(var.val[0] == color.val[0] &&
               var.val[1] == color.val[1] &&
  var.val[2] == color.val[2] )
cvSet2D(dst_image, nRow, nCol, var);
}
}
free(text_image->imageData); // 이미지 데이터가 남아 있을수 있으므로 메모리 해제..( // 이부분이 없으면 GDI는 증가하지 않으나 메모리는 늘어남.
cvReleaseImage(&text_image);
DeleteObject(hBitmap);
}

// Text To Bitmap 텍스트를 비트맵으로 처리..
HBITMAP CGlobal::setTextToBitmap(char* text, CvScalar color)
{
int textLength = (int)strlen(text);

if(textLength <= 0) return NULL;

HDC hTextDC = CreateCompatibleDC(NULL);
HFONT hOldFont = (HFONT)SelectObject(hTextDC, (HFONT)GetStockObject(SYSTEM_FONT));// 시스템 폰트로 지정
HBITMAP hDstBMP = NULL;

RECT textArea = {0, 0, 0, 0};
DrawText(hTextDC, (LPCTSTR)text, textLength, &textArea, DT_CALCRECT); // DC에 텍스트 임시로 쓰기..

if( (textArea.right > textArea.left) && (textArea.bottom > textArea.top) )
{
BITMAPINFOHEADER  bitmapInfoHeader;
memset(&bitmapInfoHeader, 0x0, sizeof(BITMAPINFOHEADER) );

void *lpvBits = NULL;

bitmapInfoHeader.biSize = sizeof(bitmapInfoHeader);
bitmapInfoHeader.biWidth = textArea.right - textArea.left;
bitmapInfoHeader.biHeight = textArea.bottom - textArea.top;
bitmapInfoHeader.biPlanes = 1;
bitmapInfoHeader.biBitCount = 32;
bitmapInfoHeader.biCompression = BI_RGB;
hDstBMP = CreateDIBSection(hTextDC, 
(LPBITMAPINFO)&bitmapInfoHeader, 
0, 
(LPVOID*)&lpvBits, 
NULL, 
0);
HBITMAP hOldBMP = (HBITMAP)SelectObject(hTextDC, hDstBMP); // DC에서 비트맵 정보를 가져옴

if(hOldBMP != NULL)
{
int TEXT_RED   = (int)color.val[2];
int TEXT_GREEN = (int)color.val[1];
int TEXT_BLUE  = (int)color.val[0];
SetTextColor(hTextDC, RGB(TEXT_RED, TEXT_GREEN, TEXT_BLUE) ); // 글자색상.
SetBkColor(hTextDC, 0x00EFFEFF); // 배경 색상
SetBkMode(hTextDC, OPAQUE); // 투명하게 처리

DrawText(hTextDC, (LPCTSTR)text, textLength, &textArea, DT_NOCLIP);
}
::SelectObject(hTextDC, hOldBMP);
}
::SelectObject(hTextDC, hOldFont);
if(hTextDC) { ::DeleteDC(hTextDC);}
if(hOldFont){ ::DeleteObject(hOldFont);}

return hDstBMP;
}

// Bitmap to IplImage 한글 출력을 한 영상을 비트맵으로 변경
IplImage * CGlobal::setBitmapToIplImage(HBITMAP hBitmap)
{
BITMAP bitmap;
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bitmap);

int nChannels = (bitmap.bmBitsPixel == 1) ? 1 : bitmap.bmBitsPixel * 0.125;
int depth = (bitmap.bmBitsPixel == 1) ? IPL_DEPTH_1U : IPL_DEPTH_8U;
IplImage * mImage = cvCreateImageHeader(cvSize(bitmap.bmWidth, bitmap.bmHeight),
 depth, nChannels);
mImage->imageData = (char*)malloc(bitmap.bmHeight * bitmap.bmWidth * nChannels * sizeof(char) );
memcpy(mImage->imageData, (char*)(bitmap.bmBits), bitmap.bmHeight * bitmap.bmWidth * nChannels);

cvFlip(mImage, mImage, 0); // 상하 뒤집기
return mImage;
}


* 사용법

CString strTemp; strTemp.Format( "한글 텍스트 쓰기 테스트입니다."); setPutText(showImage, showImage, (LPSTR)(LPCSTR)strTemp, cvPoint(10, 10), CV_RGB(255,255,102)); // 텍스트 쓰기


이렇게 처리하면 화면 메모리가 계속 증가해서 시스템이 다운되는 문제가 해결되었다.

아직까지는 문제가 없는 듯하지만.. 다른 문제가 발생한다면.. 다시 한번 찾아봐야지.. 뭐...

에고 힘들다..

P.S Conv2님의 글에 트랙백을 걸려고 했으나.. 트랙백이 막혀 있는지 트랙백 에러가 난다.. ㅠㅠ
저작자표시비영리변경금지
  • 카카오스토리
  • 트위터
  • 페이스북

'1.소프트웨어 이야기 > 02.Vision(Image Processing)' 카테고리의 다른 글

영상에서 무게 중심 구하기  (0) 2010.10.28
OpenCV에서의 한글(Unicode) 출력 관련해서..  (5) 2010.08.16
OpenCV(IplImage) <-> ARToolKit(ARUnit8) 상호 변환 방법  (1) 2010.05.25
Visual Studio 2008에서의 OPENGL라이브러리 빠짐..  (2) 2010.04.09
Posted by 희파파 희자매(가희나희)아빠
OpenCV, 비트맵, 유니코드, 한글

  • 2013.03.19 21:10

    비밀댓글입니다


    • 2018.02.13 12:17

      비밀댓글입니다

  • 나그네
    2013.03.20 08:59

    해당 코드가 릴리즈모드에서는 글자가 깨지나요? 디버그모드에서는 한글출력이 잘되던데 릴리즈모드에서는 cvputtext의 인자로는 잘넘어가는데 말이죠

  • 작은쌀톨
    2016.12.06 09:54

    프로그래밍 초보자라서 왜그런지 모르겠지만
    이걸 그대로 쓰면 CGlobal에서 오류가 나네요 ㅠㅠ
    뭐가 빠진걸까요 ㅠㅠ

    • Favicon of https://kimyongyu.com BlogIcon 희파파 희자매(가희나희)아빠
      2018.02.13 12:17 신고

      Global이란 클래스를 안 만드셔서 그렇네요..

트랙백

※ 스팸 트랙백 차단중 ...{ ? }
이전페이지 다음페이지
블로그 이미지

잡다한 지식, 엉뚱한 생각들, 내 맘대로 사진, 프로그램 개발 이야기 등등을 저장하기 위해 만들어 놓은 개인 블로그입니다. 문의나 요청은 늦게라도 받겠으나 악플이나 욕설은 정중히 사양하겠습니다.

by 희자매(가희나희)아빠

공지사항

    최근...

  • 포스트
  • 댓글
  • 트랙백
  • Windows10 God Mode 만들기
  • 시작프로그램을 레지스트리에서 직⋯
  • 비트, HEXA 연산하기
  • VCL(C++ Builder, Delphi) 기본 색⋯ (1)
  • OCX 사용자가 강제로 등록하기..
  • 더 보기
  • 혹시 define 해 놓은 자료는 없을⋯
    XM ㆍ 01.12
  • 덕분에 잘 사용하고 있습니다.. 앞⋯
    TEST ㆍ 01.12
  • 저들은 이제 안봐야죠
    깜짝 ㆍ 2018
  • Global이란 클래스를 안 만드셔서⋯
    가희나희아빠 희자매(가희나희)아빠 ㆍ 2018
  • 프로그래밍 초보자라서 왜그런지⋯
    작은쌀톨 ㆍ 2016

태그

  • 아이폰4
  • MFC
  • RAD
  • 가희
  • LabView
  • 김어준
  • dll
  • C++ Builder
  • 나는 꼼수다
  • DSLR
  • OpenCV
  • 주진우
  • halcon
  • 2MB
  • 아이튠즈
  • 아이폰
  • Nikon
  • 아카데미
  • 프라모델
  • D80
  • iOS5
  • 나희
  • VCL
  • 나꼼수
  • 금연
  • 이명박
  • K1A1
  • RAD STUDIO
  • MVT
  • 태양광

글 보관함


  • 2020/12
    (1)

  • 2019/12
    (1)

  • 2018/08
    (1)
«   2021/01   »
일 월 화 수 목 금 토
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

링크

카테고리

My Life (433)
0.일상다반사 (156)
00.사는 이야기 (56)
01.내 생각.. (28)
09.다른이 생각 (26)
10.취미활동 (15)
17.종이공작 (2)
11.갖고 싶어.. (8)
20.집꾸미기 (10)
70.돈 (2)
99.금연 메모 (6)
1.소프트웨어 이야기 (175)
00.VCL(C++ Builder, Delphi) (52)
01.MFC(Visual Studio) (22)
02.Vision(Image Processing) (19)
03.LabView&CVI (4)
04.Apple (18)
09.ETC (37)
10.번역 작업 (7)
devkyy.My Develope Program (14)
3.막찍사(사진 이야기) (61)
00.집과 주변에서 (20)
01.집이 아닌곳 (41)
07.개인사진 (0)
7.자료수집 (3)
00.Idea (0)
01.Thinking (1)
07.Money (1)
9.리뷰&이벤트 (38)
00.이벤트 참여 (5)
01.제품 리뷰 (33)

카운터

Total
404,495
Today
10
Yesterday
44
방명록 : 관리자 : 글쓰기
희자매(가희나희)아빠's Blog is powered by daumkakao
Skin info material T Mark3 by 뭐하라
favicon

김용유닷컴

잡다한 지식, 엉뚱한 생각들, 내 맘대로 사진, 프로그램 개발 이야기 등등을 저장하기 위해 만들어 놓은 개인 블로그입니다. 문의나 요청은 늦게라도 받겠으나 악플이나 욕설은 정중히 사양하겠습니다.

  • 태그
  • 링크 추가
  • 방명록

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • My Life (433)
    • 0.일상다반사 (156)
      • 00.사는 이야기 (56)
      • 01.내 생각.. (28)
      • 09.다른이 생각 (26)
      • 10.취미활동 (15)
      • 17.종이공작 (2)
      • 11.갖고 싶어.. (8)
      • 20.집꾸미기 (10)
      • 70.돈 (2)
      • 99.금연 메모 (6)
    • 1.소프트웨어 이야기 (175)
      • 00.VCL(C++ Builder, Delphi) (52)
      • 01.MFC(Visual Studio) (22)
      • 02.Vision(Image Processing) (19)
      • 03.LabView&CVI (4)
      • 04.Apple (18)
      • 09.ETC (37)
      • 10.번역 작업 (7)
      • devkyy.My Develope Program (14)
    • 3.막찍사(사진 이야기) (61)
      • 00.집과 주변에서 (20)
      • 01.집이 아닌곳 (41)
      • 07.개인사진 (0)
    • 7.자료수집 (3)
      • 00.Idea (0)
      • 01.Thinking (1)
      • 07.Money (1)
    • 9.리뷰&이벤트 (38)
      • 00.이벤트 참여 (5)
      • 01.제품 리뷰 (33)

카테고리

PC화면 보기 티스토리 Daum

티스토리툴바