[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개의 댓글