[python] OpenCV 공부노트 도형다루기

글쓴이 Engineer Myoa 날짜

 

[python] OpenCV 공부노트 간단한 영상 조작

 

원과 타원 그리기

#pragma warning(disable: 4819)

#include "opencv.hpp"
using namespace cv;
using namespace std;

int main()
{
	Mat someImage(1000, 1000, CV_8UC3, Scalar(255, 255, 255));

	rectangle(someImage, Point(100, 100), Point(400, 400), 1);

	line(someImage, Point((100 + 400) / 2, 100), Point((100 + 400) / 2, 400), Scalar(240, 40, 40), 1);
	line(someImage, Point(100, (100 + 400) / 2), Point(400, (100 + 400) / 2), Scalar(240, 40, 40), 1);

	circle(someImage, Point((100 + 400) / 2, (100 + 400) / 2), (400 - 100) / 2, Scalar(40, 240, 40), 1); // thickness = -1이면 filling
	circle(someImage, Point((100 + 400) / 2, (100 + 400) / 2), 50, Scalar(40, 40, 250), -1); //

	RotatedRect someRRect(Point(250, 450), Size(200, 400), 45); // 90은 일반 원
	ellipse(someImage, someRRect, Scalar(60, 60, 177), 1); // 수평축과 45도 기울기, 360-100도만 그림.

	//ellipse(someImage, Point(250,450), Size(100,200), 45, 100, 360, Scalar(60, 60, 177), 1); // 수평축과 45도 기울기, 360-100도만 그림.
	ellipse(someImage, Point(250, 450), Size(100, 200), -45, 0, 360, Scalar(222, 60, 55), 1); // 수평축과 -45도 기울기, 360도 그림.

	circle(someImage, Point(250, 450), 4, Scalar(0, 0, 0), -1); // 타원 중심점 표현

	imshow("some", someImage);
	waitKey(0);

}

 

예제만 따라치기 심심해서 응용하여 궁금증을 해결했다. 각 drawing함수의 파라미터값이 궁금했었는데..

RotateRect는 ellipse 에서 Point와 Size, 수평선 기준 angle을 담을 수 있는 객체이다. 단, 이렇게 drawing하면 항상 닫힌 타원이 된다.

 




#pragma warning(disable: 4819)

#include "opencv.hpp"
using namespace cv;
using namespace std;

int main()
{

	Mat someImage(512, 512, CV_8UC3, Scalar(255, 255, 255));

	vector<vector<Point> > contour(2, vector<Point>());
	contour[0].push_back(Point(100, 100));
	contour[0].push_back(Point(200, 100));
	contour[0].push_back(Point(200, 200));
	contour[0].push_back(Point(100, 200));

	contour[1].push_back(Point(300, 200));
	contour[1].push_back(Point(400, 100));
	contour[1].push_back(Point(400, 200)); // 각 배열요소마다 가질 수 있는 인자는 계속적임. push_back하기 때문

	const cv::Point *pt1 = (const cv::Point*) Mat(contour[0]).data;
	const cv::Point *pt2 = (const cv::Point*) Mat(contour[1]).data;

	const Point *polygon[2] = { pt1, pt2 };
	int nPt[2] = { contour[0].size(), contour[1].size() };

	//polylines(someImage, polygon, nPt, 2, true, Scalar(255, 0, 0)); // 동일하게 isClose에 따라 도형을 닫을 것인지 여부 가능
	//polylines(someImage, polygon, nPt, 2, true, Scalar(255, 0, 0)); // 동일하게 isClose에 따라 도형을 닫을 것인지 여부 가능
	fillPoly(someImage, polygon, nPt, 2, Scalar(255, 0, 0));          // 내부를 채움

	imshow("some", someImage);
	waitKey(0);


	return 0;
}

 

이번엔 vector을 이용하여 Polygon을 그리는 방법.  이게 더 편하게 느껴진다. 굳이 Point를 하드하게 선언할 필요가 없으니..

 

 

 




 

#pragma warning(disable: 4819)

#include "opencv.hpp"
using namespace cv;
using namespace std;

int main()
{

	Mat someImage(512, 512, CV_8UC3, Scalar(255, 255, 255));

	string text = "오픈CV Programming!@$#";

	//int fontFace = FONT_HERSHEY_SIMPLEX;
	int fontFace = FONT_HERSHEY_COMPLEX;
	double fontScale = 1.0;
	int thickness = 1;
	int baseLine;
	Point org(100, 100);

	// putText
	putText(someImage, text, org, fontFace, fontScale, Scalar(0, 0, 0));
	Size size = getTextSize(text, fontFace, fontScale, thickness, &baseLine);
	cout << size << endl << endl;
	// 419 x 22


	imshow("some", someImage);
	// 한글 출력이 안됨...

	waitKey(0);


	return 0;
}

putText로 텍스트를 넣자.

 

???….?????????????????

한글출력이 되지 않는다. 당연히 character set의 문제겠지 싶어

unicode화를 하려고 하던 찰나…

 

http://stackoverflow.com/questions/17323096/puttext-for-utf-8-characters-c

Unfortunately, cv::putText() only supports ASCII. There is an open bug report which requests special character support for this function, but it appears that this feature will not be implemented soon.

If you have compiled OpenCV with Qt support, you may be able to use cv::addText() instead.

shareimprove this answer

 

라고한다… 즉 addText를 써야만 해결된다 라는것인데.

Qt를 지원하는 OpenCV 컴파일본이어야 addText를 사용가능하다고 나와있다 주륵..

 

 

카테고리: 취미

152개의 댓글

답글 남기기

Avatar placeholder

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다