Programming/OpenCV

OpenCV 트랙바 처리된 이진화 영상처리 in C++

꾸준희 2016. 1. 5. 16:39
728x90
반응형




랙바 처리







1. cvCreateTrackbar(const char* trackbar_name, const char* window_name, int* value, int count, CvTrackbarCallback on_change);

이 함수는 지정된 윈도우에 트랙바를 생성해주는 함수이다. 인자 값은 왼쪽부터 차례대로  트랙바 이름, 트랙바를 붙일 윈도우 이름, 트랙바가 생성될 떄 슬라이더의 위치,  트랙바 슬라이더의 최대 위치 값(최소위치 값은 자동으로 0), 슬라이더가 변경될 때마다 자동 호출되는 핸들러 함수 로 이루어진다.



2. void on_change(int pos);

이 함수는 트랙바 슬라이더가 변경될 때 마다 자동 호출되며, pos는 트랙바의 슬라이더 위치이다.



3. int cvGetTrackvarPos(const char* trackbar_name, const char* window_name);

이 함수는 윈도우에서 트랙바의 슬라이더 위치 값을 반환한다.



4. void cvSetTrackbarPos(const char* trackvar name, const char* window name, int pos);

이 함수는 윈도우에서 트랙바의 슬라이더 위치를 pos로 지정한다.




이러한 네가지를 바탕으로 트랙바 처리를 하며, 트랙바 처리를 하여 이진화 한 영상은 다음 소스에 의해 생성된다.





 

#include<iostream>
#include<opencv\cv.h>
#include<opencv\highgui.h>

void on_change(int th = 0);
IplImage *srcImage, *dstImage; // 입력영상과 출력영상을 위한 IplImage
int main(){
	if ((srcImage = cvLoadImage("lena.png", CV_LOAD_IMAGE_GRAYSCALE)) == NULL){
		std::cout << "파일을 열지 못했습니다 ㅠㅠ" << std::endl;
		return -1;
	}

	dstImage = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_8U,1);
	cvNamedWindow("srcImage", CV_WINDOW_AUTOSIZE);
	cvShowImage("srcImage", srcImage);
	cvNamedWindow("dstImage", CV_WINDOW_AUTOSIZE);
	cvShowImage("dstImage", dstImage);

	// 트랙바를 위한 함수를 호출하여 트랙바 초기 위치를 100으로 설정
	int th = 100;
	on_change(th);

	// 윈도우 ditImage에 T라는 이름을 가진 트랙바를 생성하여 붙임
	// 초기 슬라이더의 위치는 &th에 의해 100이고, 최소0(자동) 최대255
	// 슬라이더가 변경될 떄 마다 on_change함수가 호출된다
	cvCreateTrackbar("T", "dstImage", &th, 255, on_change);
	cvWaitKey(0);

	// cvMat을 쓰면 자동으로 메모리 관리를 해서 이런건 안해줘도 됨 
	// OpenCV 1.0에서 썼던 IplImage를 써서 메모리 관리를 직접 해주어야함
	cvDestroyWindow("srcImage");
	cvDestroyWindow("dstImage");
	cvReleaseImage(&srcImage);
	cvReleaseImage(&dstImage);

}
void on_change(int th){
	//direct thresholding
	int x, y, s, r;
	int nThreshold = th; // 슬라이더의 위치 저장 
	for (y = 0; y < srcImage->height; y++){
		for (x = 0; x < srcImage->width; x++){
			// cvRound는 정수형으로 변환할 때 반올림을 함
			r = cvRound(cvGetReal2D(srcImage, y, x));

			// 입력영상에서 nThreshold(100)보다 큰 값을 갖는 화소는 255
			// 그렇지 않는 화소는 0으로 설정함
			if (r > nThreshold)
				s = 255;
			else
				s = 0;

			// 영상포인터인 dstImage에 행(y),열(x) 요소 값에 s(value)값을 저장
			cvSetReal2D(dstImage, y, x, s);
		}
	}
	cvShowImage("dstImage",dstImage);
}




728x90
반응형