리스트 로그 처럼 계속 문자열을 받아서 추가하는 함수는 컨트롤은 에디트 컨트롤을 사용하고 ReplaceSel() 를 이용해서 계속 문자열을 넣도록 하자 { CString str; // 문자열을 저장할 변수 m_edtLoggingOut.SetSel(-2, -1); // 커서를 에디트박스 끝으로 이동 or int len = m_edtLoggingOut.GetWindowTextLength(); // 글자 길이를 받아오기 m_edtLoggingOut.SetSel(len, len); // 글자 길이만큼 커서 이동 m_edtLoggingOut.ReplaceSel(str); // 에디트 박스에 글자 추가 } 요렇게 하면 계속 글자를 추가 할 수 있다.
일단 화면 구성은 아래와 같이 하였다. 왼쪽 이미지 리스트에서 파일을 선택하면 가운데 이미지가 나오고 오른쪽에 텍스트가 나오도록 그리고 아래쪽은 동작에 따른 로그를 출력할 계획이다. 우선은 프로젝트를 생성해주고 이전에 챙겨놨던 것들을 포함시켜 준다. 사실 안되는 것들때문에 이것 저것 추가하다보니 다 추가해버렸는데 이젠 모르겠다 ㅎㅎ 라이브러리들도 챙겨 넣고! 죄다 넣었다!! Ctranslator.h #pragma once #include "tesseract/baseapi.h" #include "leptonica/allheaders.h" #include "opencv2/opencv.hpp" class CTranslator { private: tesseract::TessBaseAPI* _Api; tesseract::Tesseract* m_API; public: CTranslator(); ~CTranslator(); void CreateTesseract(); bool Translate(cv::Mat Img, CString& strOut); }; 이왕 만드는거 클래스로 ㅋㅋ 근데 여기 C++ 소스는 배경화면이 안변하네 파이썬 소스는 뒤에 검게 변하더니... CTranslator::CTranslator() { _Api = nullptr; CreateTesseract(); } 생성자에서 초기화하는 함수 호출! void CTranslator::CreateTesseract() { if(_Api == nullptr) _Api = new tesseract...
라인 스캔 카메라를 고속으로 사용할 일이 있어 스캔 속도를 높였더니 이미지가 뒤죽박죽이 되는 현상이 발생하였다. 아무래도 이미지를 합치기 위해 한 줄씩 카피하다보니 메모리에서 이미지 카피 속도 보다 카메라에서 던지는 속도가 더 빠른듯 하다. 일단 카메라에서 받는 이미지를 concurrent_queue 에 넣고 다른 쓰레드에서 이를 빼서 처리하는 방식으로 코드를 수정하였다. concurrent_queue 는 멀티 쓰레드에서 사용하기 편한 Queue 로 Push 나 try_pop 을 할 때 다른 쓰레드에서의 접근을 신경쓰지 않아도 된다. CCriticalSection 을 Lock, Unlock 하지 않아도 된다는 말씀! 검색해본 결과 empty, push, get_allocator, try_pop 함수만 쓰레드 세이프 하고 다른 함수들은 접근하고 있는 쓰레드의 유무에 따라 값이 바뀔수도 있다고 한다. 사용법은 concurrent_queue<template> _QUEUE; 로 선언 후 _QUEUE.push( 객체 ); 로 push _QUEUE.try_pop(&객체) 로 Pop 하여 사용하면 된다. #include < concurrent_queue . h > concurrent_queue<int> _QUEUE; _QUEUE.push(1); int a = 0; _QUEUE.try_pop(&a); --- 추가 --- 생각대로는 잘 안된다. push는 모르겠는네 try_pop 과 empty 가 동시에 두 개 이상 쓰레드에서 진행될 때 문제가 발생했다. empty로 동시에 접근하고 try_pop 할 때 문제가 발생한다;;; 어쩔 수 없이 Lock과 Unlock 을 사용하여 문제를 해결하여 사용중이다. 조금 더 공부가 필요...
댓글
댓글 쓰기