[python] OpenCV 공부노트 도형다루기
[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, If you have compiled OpenCV with Qt support, you may be able to use |
라고한다… 즉 addText를 써야만 해결된다 라는것인데.
Qt를 지원하는 OpenCV 컴파일본이어야 addText를 사용가능하다고 나와있다 주륵..
152개의 댓글