現在、作成中…
もくじ
- 基本図形
1. 基本図形
1.1 直線を描く
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#include <opencv2/opencv.hpp> int main(void) { // 画像を格納するオブジェクトを宣言する // # CV_8UC3 : 8bit 3channel フルカラー画像 cv::Mat image(400, 400, CV_8UC3); for (int n = 0; n < 4; n++) { int lineType, lineWidth; switch (n) { case 0: // 線幅1、8連結で描く lineType = cv::LINE_8; lineWidth = 1; break; case 1: // 線幅1、4連結で描く lineType = cv::LINE_4; lineWidth = 1; break; case 2: // 線幅1、アンチエイリアシングで描く lineType = cv::LINE_AA; lineWidth = 1; break; case 3: // 線幅4、アンチエイリアシングで描く lineType = cv::LINE_AA; lineWidth = 4; break; } // 画像を白色で塗りつぶす // # 色を Scalar(Blue, Green, Red) で指定する。BGRの順番であることに注意 image = cv::Scalar(255, 255, 255); for (int i = 0; i < 360; i += 10) { // 始点と終点の座標 // # cv::Pointで整数座標(x,y)を指定する。行列Matと違って(x,y)の並びであることに注意 cv::Point p1(200, 200); // 始点座標(200,200) cv::Point p2; // 終点座標 下の計算式で、円周上に10度おきに配置 p2.x = cos(i * CV_PI / 180) * 200 + p1.x + 0.5; p2.y = sin(i * CV_PI / 180) * 200 + p1.y + 0.5; // 線を引く // # line(画像, 始点座標, 終点座標, 色, 線幅, 連結) cv::line(image, p1, p2, cv::Scalar(255, 0, 0), lineWidth, lineType); } cv::imshow("画像", image); cv::waitKey(); } return 0; } |
1.2 四角形、正円を描く
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#include <opencv2/opencv.hpp> int main(void) { // 画像を格納するオブジェクトを宣言する // # CV_8UC3 : 8bit 3channel フルカラー画像 cv::Mat image(400, 400, CV_8UC3); // 画像を白色で塗りつぶす image = cv::Scalar(255, 255, 255); // 四角形を描く 1 // # rectangle(画像, 頂点1, 頂点2, 色, 線幅, 連結) // # 頂点1,2を対角とし、傾きのない四角形を描く cv::Point p1(10, 10), p2(190, 90); cv::rectangle(image, p1, p2, cv::Scalar(255, 0, 0), 1, cv::LINE_4); // 四角形を描く 2 // # rectangle(画像, 四角形, 色, 線幅, 連結) // # cv::Rect(始点x, 始点y, 幅, 高さ) を基にして、傾きのない四角形を描く cv::Rect rect(210, 10, 180, 80); cv::rectangle(image, rect, cv::Scalar(0, 0, 255), 1, cv::LINE_4); for (int i = 0; i < 13; i++) { cv::Rect rect(i * 30 + 10, 100, 20, 80); // # 線幅 < 0 のときは四角形内を塗りつぶす cv::rectangle(image, rect, cv::Scalar(255 - i * 20, 0, i * 20 + 15), -1, cv::LINE_4); } for (int i = 1; i < 7; i++) { // 正円を描く // # circle(画像, 中心座標, 半径, 色, 線幅, 連結) cv::circle(image, cv::Point(i * i * 9 + 10, 250), i * 9 - 1, cv::Scalar(0, 200, 0), 1, cv::LINE_AA); // # 線幅 < 0 のときは円内を塗りつぶす cv::circle(image, cv::Point(384 - i * i * 9, 340), i * 9 - 1, cv::Scalar(0, 200, 0), -1, cv::LINE_AA); } cv::imshow("画像", image); cv::waitKey(); return 0; } |
1.3 楕円、扇形、円弧を描く
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#include <opencv2/opencv.hpp> int main(void) { // 画像を格納するオブジェクトを宣言する // # CV_8UC3 : 8bit 3channel フルカラー画像 cv::Mat image(400, 400, CV_8UC3); // 画像を白色で塗りつぶす image = cv::Scalar(255, 255, 255); // 回転四角形 // # RotatedRect(中心座標, サイズ(x, y), 回転角度degree) cv::RotatedRect rect1(cv::Point2f( 80, 80), cv::Size(120, 60), 0); cv::RotatedRect rect2(cv::Point2f(200, 80), cv::Size(120, 60), 45); cv::RotatedRect rect3(cv::Point2f(320, 80), cv::Size(120, 60), -30); // 楕円を描く // # ellipse(画像, RotatedRect, 色, 線幅, 連結) cv::ellipse(image, rect1, cv::Scalar(255, 0, 255), 1, cv::LINE_AA); cv::ellipse(image, rect2, cv::Scalar(255, 0, 255), 2, cv::LINE_AA); cv::ellipse(image, rect3, cv::Scalar(255, 0, 255), -1, cv::LINE_AA); // 円弧、扇形を描く // # ellipse(画像, 中心座標, Size(x径, y径), 楕円の回転角度, 始点角度, 終点角度, 色, 線幅, 連結) cv::ellipse(image, cv::Point( 80, 200), cv::Size(50, 50), 0, 0, 225, cv::Scalar(255, 200, 0), 1, cv::LINE_AA); cv::ellipse(image, cv::Point(200, 200), cv::Size(50, 50), 0, 0, 225, cv::Scalar(255, 200, 0), -1, cv::LINE_AA); cv::ellipse(image, cv::Point(320, 200), cv::Size(50, 50), 0, -225, 45, cv::Scalar(255, 200, 0), -1, cv::LINE_AA); cv::ellipse(image, cv::Point( 80, 320), cv::Size(60, 30), 0, 0, 225, cv::Scalar(0, 180, 255), 1, cv::LINE_AA); cv::ellipse(image, cv::Point(200, 320), cv::Size(60, 30), 45, 0, 225, cv::Scalar(0, 180, 255), 2, cv::LINE_AA); cv::ellipse(image, cv::Point(320, 320), cv::Size(60, 30), -30, -225, 45, cv::Scalar(0, 180, 255), -1, cv::LINE_AA); cv::imshow("画像", image); cv::waitKey(); return 0; } |
1.4 多角形を描く
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
#include <opencv2/opencv.hpp> using namespace std; int main(void) { // 画像を格納するオブジェクトを宣言する // # CV_8UC3 : 8bit 3channel フルカラー画像 cv::Mat image(400, 400, CV_8UC3); // 画像を白色で塗りつぶす image = cv::Scalar(255, 255, 255); // 多角形の頂点を設定する vector<cv::Point> p; int n = 5; for (int i = 0; i < n; i++) { p.push_back(cv::Point(cos(CV_PI * (2.0*i/n - 0.5)) * 180 + 200, sin(CV_PI * (2.0*i/n - 0.5)) * 180 + 200)); } // 多角形を描く // # polylines(画像, 頂点集合, 多角形を閉じるか, 色, 線幅, 連結) cv::polylines(image, p, true, cv::Scalar(255, 0, 0), 2, cv::LINE_AA); p.clear(); for (int i = 0; i < n; i++) { p.push_back(cv::Point(cos(CV_PI * (2.0*i/n - 0.5)) * 140 + 200, sin(CV_PI * (2.0*i/n - 0.5)) * 140 + 200)); } // 中を塗りつぶした多角形を描く // # fillConvexPoly(画像, 頂点集合, 色, 連結) cv::fillConvexPoly(image, p, cv::Scalar(0, 0, 255), cv::LINE_AA); // fillPolyを使う場合は次のようにする // vector<vector<cv::Point>> pp; // pp.push_back(p); // cv::fillPoly(image, pp, cv::Scalar(0, 0, 255), cv::LINE_AA); cv::imshow("多角形描画", image); cv::waitKey(); // 複数の多角形を一度に描く // 多角形の頂点を設定する vector<vector<cv::Point>> ps(16); for (int n = 0; n < 16; n++) { cv::Point p0((n % 4) * 100 + 50, (n / 4) * 100 + 50); for (int i = 0; i < n + 3; i++) { cv::Point pa(cos(CV_PI * (2.0*i/(n+3) - 0.5)) * 40, sin(CV_PI * (2.0*i/(n+3) - 0.5)) * 40); ps[n].push_back(p0 + pa); } } image = cv::Scalar(255, 255, 255); // 多角形を描く cv::fillPoly(image, ps, cv::Scalar(0, 255, 255), cv::LINE_AA); // 黄色で塗りつぶした多角形 cv::polylines(image, ps, true, cv::Scalar(0, 0, 0), 3, cv::LINE_AA);// 黒色の線の多角形 cv::imshow("多角形描画", image); cv::waitKey(); return 0; } |