728x90
반응형


이제 지겨운 OpenCV 자료형 공부는 끝내고 그나마 재미있는(?) 직선그리기, 사각형그리기, 직선 클리핑을 해보겠다.

직선, 사각형을 그리고 직선 클리핑을 할 수 있는 함수에 대해서 소개하도록 하겠다. 

직선 그리는 함수 line()
void line(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0);
차례대로, 영상Mat, 좌표점1, 좌표점2, 색상, 두께, 타입(CV_AA 이면 안티에일리징 라인), 좌표 시프트연산을 한 결과를 나타낸다.

사각형 그리는 함수 rectangle
void rectangle(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0);

차례대로, 영상 Mat, 좌표점1, 좌표점2, 색상, 두께(-1이면 color 색상으로 채운 사각형을 그림), 타입, 시프트연산을 뜻한다.

void rectangle(Mat& img, Rect rec, const Scalar& color, int thickness=1, int lineType=8, ins shift=0);

이 함수는 영상 img에 사각형 rec에 의해 정의되는 직사각형을 color 색상으로 thickness 두께로 사각형을 그리는 것이다. 


직선 클리핑을 하는 함수 clipLine

bool clipLine(Size imgSize, Point& pt1, Point& pt2);

bool clipLine(Rect imgRect, Point& pt1, Point& pt2);

클리핑 기능을 수행하는 이 함수는 좌표점 pt1에서 pt2 까지 연결하는 라인이 imgSize 또는 imgRect로 정의되는 사각형에 의해 절단되는 좌표점을 pt1과 pt2에 계산하는 함수이다. 만약 직선이 사각형 영역 밖에 있으면 false를 반환한다.  

Rect의 형태는 Rect(0, 0, imgSize.width, imgSize.height); 이다.





아래 예제의 첫번째 결과는 사각형을 그리고 그 사각형의 1/2 사이즈의 사각형을 그리고 대각선을 긋는 예제이고, 두번째 결과는 직선이 사각형에 의해 절단되는 부분을 원으로 그려 표시한 예제이다. 



소스코드

 
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;

int main(){
	
	/* 1. basic line, rectangle drawing */
	
	// white windows create, 512 x 512, 3 channels  
	Mat dstImage(512, 512, CV_8UC3, Scalar(255, 255, 255));
	if (dstImage.empty())
		return -1;

	// drawing (100,100)~(400,400), red rectangle, thickness is 2
	rectangle(dstImage, Point(100, 100), Point(400, 400), Scalar(0, 0, 255), 2); 

	// red diagonal line drawing, thickness is 2
	line(dstImage, Point(400, 100), Point(100, 400), Scalar(0, 0, 255), 2);

	// 1/2 size blue rectangle create
	rectangle(dstImage, Point(400 / 2, 100 / 2), Point(100 / 2, 400 / 2), Scalar(255, 0, 0));

	imshow("result 1", dstImage);
	
	// windows clear -> white
	for (int i = 0; i < dstImage.rows; i++)
		for (int j = 0; j < dstImage.cols; j++)
			dstImage.at<Vec3b>(i, j) = Vec3b(255, 255, 255);

	waitKey();


	/* 2. line cliping start */

	Rect imgRect(100, 100, 300, 300);

	// 두 모서리 좌표를 .tl(), .br()을 이용하여 반환
	rectangle(dstImage, imgRect.tl(), imgRect.br(), Scalar(255, 0, 0), 2);

	Point pt1(120, 50), pt2(300, 500);
	line(dstImage, pt1, pt2, Scalar(0, 255, 0), 2);

	// clipLine함수는 라인이 사각형에 의해 절단되는 좌표점을 pt1, pt2에 계산
	clipLine(imgRect, pt1, pt2);
	cout << "pt1 = " << pt1 << endl;
	cout << "pt2 = " << pt2 << endl; 

	// 절단되는 좌표점에 원을 그림
	circle(dstImage, pt1, 5, Scalar(0, 0, 255), 2);
	circle(dstImage, pt2, 5, Scalar(0, 0, 255), 2);
	line(dstImage, pt1, pt2, Scalar(255, 0, 0), 2);
	
	imshow("result 2", dstImage);
	waitKey();
	return 0;
}




[그림 1] 직선 그리기, 사각형 그리기, 직선 클리핑을 한 결과 


728x90
반응형

'Programming > OpenCV' 카테고리의 다른 글

OpenCV contrib 설치 및 Cmake  (4) 2016.11.14
OpenCV 설치 시 에러 LNK1112  (0) 2016.11.12
OpenCV 기본클래스 (3)  (0) 2016.08.13
OpenCV 기본클래스 (2)  (0) 2016.08.13
OpenCV 기본클래스 (1)  (7) 2016.08.13