'OpenCV1.1'에 해당되는 글 3건

  1. 2009.04.21 SAHGM Software Ver1.03
  2. 2009.04.18 SAHGM Software Ver1.02
  3. 2009.04.13 SAHGM Software Ver1.0

내일 자료구조(재수강 ㅠㅠ) 시험에도 불구하고,, 또 웬일인지 졸작욕구가 생겨 ㅡㅡ;;



오늘은 간단히(!?) 새롭게 만든 UI인 Toolbox 에서 Threshold slider bar를 조정하면
Threshold 수치에 따라 결과 영상물이 바뀌도록 처리하였다.


:: VideoCapture.cpp - in ThreadProc
cvThreshold(th_frame, th_frame, m_intThreshold, 255, CV_THRESH_BINARY );

이진 Threshold 처리는 위의 함수를 이용하여 처리하였다..

<Toolbox 에서 Threshold 의 값에 따라 영상에 적용이 되도록한 스샷>


하지만, Threshold 에 따라, IR에 대한 광량이 아무래도 많이 부족하거나 문제점이 있다.



ver 1.02에서 언급 했듯이, 뒷 배경에 태양이 비춘다든지, 형광조명등이 뒤에서 나온다든지 했을 때, Threshold 의 수치에 따라 손이외의 것들이 많이 나오는 경우도 있어서 인식 오류율이 걱정된다.


하지만, 잘 헤쳐나가자!!

오늘은 여기까지 ㅠㅠ 공부해야지;;


저작자 표시 비영리 변경 금지
신고
Posted by 바로아이

댓글을 달아 주세요

오늘은 중간고사 기간이지만,
너무나도 하고싶어서 약간이나마, 수정을 해보았다..


:: 변동 사항
일단 IR CAM에 네거티브 필름 (IR CUT FILTER) 2장에서 1장으로 교체


항상 밤에하다가 낮에 해보니 아뿔사 이런 일이 ㅡㅜ

뒤에 태양빛이 너무 강력해서....
앞에서 아무리 IRLED 6개로 때려도 별 차이가 없는 것이다...

아침에 일어나자마자 해서 머리가 뜬게 찍혀버렸네여ㅡㅜ( 난 상관없음...)

LED on 상태

LED off 상태




어떻게 처리해야할지... 한참을 고민..하다가....

이전에 해결해야할 문제가 생겼다.


`CameraCapture`를  쓰레딩으로 처리했는데, 내부에서 메모리 관련 에러 문제이 발견!!

아래의 소스는 내가 코딩한 부분이다.
원리는 Capture 변수에 카메라 정보를 받아와, IplImage 변수에 한 프레임씩 넣으면서, 영상을 다루게 되는데....
IplImage *sr_frame 을 해제 한 후, cvCapture를 해제하는 방법으로 처리하려고 했다.


CvCapture *capture = 0
IplImage *sr_frame = 0;

// Get Camera Handle
if( !(capture = cvCreateCameraCapture(0)) )
return FALSE;

cvGrabFrame(capture);
sr_frame = cvRetrieveFrame(capture);

cvReleaseImage(&sr_frame);
cvReleaseCapture(&capture);

위의 소스를 돌리게되면 cvReleaseCapture 에서 메모리 관련 에러를 발생한다....


오랜 시간( 약 1시간 ㅡㅜ) 끝에 찾아낸 문제점


cvCreateCameraCapture() 함수 사용 후,

cvReleaseCapture() 함수를 쓰게 되면,

아래
void CvCaptureCAM_DShow::close()
{
    if( index >= 0 )
    {
        VI.stopDevice(index);
        index = -1;
        cvReleaseImage(&frame);
    }
}
코드를 호출하게 되는데, 안에 보면 이미, cvReleaseImage()를 호출 하고 있었다..............
그래서 에러가 계속 나는 것이었다.

즉, 

Capture를 통해 받아오는 IplImage 변수는 따로 해제하지 않아도 된다는 점이다!!




:: 쓰레딩 처리 방법

처리할 루틴 클래스를 새로 만들어

m_hThreadHandle = CreateThread(NULL, 0, ThreadProc, this, 0, &m_dwThreadID);

로 쓰레드를 하나 생성하여,
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
return ((CVideoCapture*)lpParam)->SAHGMProc();
}

DWORD CVideoCapture::SAHGMProc(void)
{
....(생략 : 위에서 언급한 CameraCapture를 작동되도록 하였다.)...
}

Thread 함수에서 클래스 함수를 캐스팅하여 실행하도록 하여, 좀더 프로그래밍의 유연성을 확보하였다.



아 오늘 정확히 14시간 걸렸다.

이유는 Thread 처리로 인한 Memory Leak 현상, WiatForSingleObject 무한 루프 현상, 등의 갖가지 문제로 쓸데없는(?!) 시간을 보냈다..

지만, 메모리 누수를 처음에 잘 잡아 놓지 않으면 나중에 더 큰 문제가 생긴다는 것을 알기에 몇시간을 걸리더라도 
시험을 앞두고도 잡아야 했고..

드뎌 원하던 개발  GUI환경의 발판이 마련된것 같다.
















저작자 표시 비영리 변경 금지
신고
Posted by 바로아이

댓글을 달아 주세요

OpenCV 1.1 기반

기존 1.0에서의 CVCAM Library가 사라지고,

HighGui library 에서 처리하도록 되어졋다.

이에 따라 CvCapture 구조체를 쓰게 되었는데,

CvCapture같은 경우, 기존 1.0에서 MS社의 LifeCam VX-7000 이 인식 안되었는데, 1.1 에서 테스트 결과 잘 인식 되었다.
=> 그냥 넘길수 없어서 VX-7000 모델이 지워되도록 소스 코딩을 시도 해보았는데,

cvQueryFrame(capture);
으로 했을 때는 회색만 나오던 것이

cvGrabFrame(capture);
frame = cvRetrieveFrame(capture);
으로 하니, 잘 나오기 시작하였다.


느낌만 무언가 바뀌엇다는 것을 느꼈지만,
어쨰든, 이번 프로젝트에서 사용되는 캠은 SavitMicro V-Gear CCD 이기때문에 큰 상관은 없엇다.


:: stdafx.h ::
opencv library & header 추가
/* Added Libraries */
#ifdef _DEBUG
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"highgui.lib")
#else if NDEBUG
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"highgui.lib")
#endif

/* added OpenCV Header files */
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>


본 프로젝트를 위해 기본 영상 입력 사이즈 및 프레임수는 30fps, 320 * 240 사이즈로 정하였다.

cvSetCaptureProperty( capture, CV_CAP_PROP_FPS, 30.f);
cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH,  320);
cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, 240);

위의 소스는 마소의 LifeCam VX-7000의 경우, 먹히지 않는 현상이 발생하더라......


어찌 됬든, 현재 V-Gear CCD 로 작업하는데에는 잘 먹혔다.











저작자 표시
신고
Posted by 바로아이

댓글을 달아 주세요



티스토리 툴바