4 描画処理

4.1 線分を描く

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

int
main(int argc, char *argv[])
{
  cv::Mat img = cv::Mat::zeros(500, 500, CV_8UC3);

  // Red,太さ3,4近傍連結
  cv::line(img, cv::Point(100, 100), cv::Point(400, 105), cv::Scalar(0,0,200), 3, 4);  
  // Green,太さ5,8近傍連結
  cv::line(img, cv::Point(100, 200), cv::Point(400, 205), cv::Scalar(0,200,0), 5, 8);
  // Blue,太さ10,アンチエイリアス
  cv::line(img, cv::Point(100, 300), cv::Point(400, 305), cv::Scalar(200,0,0), 10, CV_AA);

  cv::namedWindow("drawing", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
  cv::imshow("drawing", img);
  cv::waitKey(0);
}

実行結果:

_images/lines.png

4.2 矩形を描く

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

int
main(int argc, char *argv[])
{
  cv::Mat img = cv::Mat::zeros(500, 500, CV_8UC3);

  // Red,太さ3,4近傍連結
  cv::rectangle(img, cv::Point(200,50), cv::Point(300, 150), cv::Scalar(0,0,200), 3, 4);
  // Green,太さ5,8近傍連結
  cv::rectangle(img, cv::Point(200,200), cv::Point(300, 300), cv::Scalar(0,200,0), 5, 8);
  // Blue,塗りつぶし,アンチエイリアス
  cv::rectangle(img, cv::Point(200,350), cv::Point(300, 450), cv::Scalar(200,0,0), -1, CV_AA);

  cv::namedWindow("drawing", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
  cv::imshow("drawing", img);
  cv::waitKey(0);
}

実行結果:

_images/rectangles.png

4.3 円を描く

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

int
main(int argc, char *argv[])
{
  cv::Mat img = cv::Mat::zeros(500, 500, CV_8UC3);

  // Red
  // 画像,円の中心座標,半径,色,線太さ,種類
  cv::circle(img, cv::Point(300, 100), 100, cv::Scalar(0,0,200), 3, 4);
  // Green
  cv::circle(img, cv::Point(200, 250), 120, cv::Scalar(0,200,0), 8, 8);
  // Blue
  cv::circle(img, cv::Point(300, 400), 80, cv::Scalar(200,0,0), -1, CV_AA);

  cv::namedWindow("drawing", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
  cv::imshow("drawing", img);
  cv::waitKey(0);
}

実行結果:

_images/draw_circles.png

4.4 楕円・円弧を描く

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

int
main(int argc, char *argv[])
{
  cv::Mat img = cv::Mat::zeros(500, 500, CV_8UC3);
  double angle;
  

  angle = 30;
  /// 画像,中心座標,(長径・短径),回転角度,円弧開始角度,円弧終了角度,色,線太さ,連結
  // Red,太さ3,4近傍連結
  cv::ellipse(img, cv::Point(400, 150), cv::Size(200, 100), angle, angle-100, angle+200, cv::Scalar(0,0,200), 3, 4);
  angle = 0;
  // Green,太さ5,8近傍連結
  cv::ellipse(img, cv::Point(200, 200), cv::Size(100, 100), angle, angle, angle+360, cv::Scalar(0,200,0), 5, 8);
  angle = 100;
  // Blue,塗りつぶし,アンチエイリアス
  cv::ellipse(img, cv::Point(200, 400), cv::Size(100, 200), angle, angle-200, angle+100, cv::Scalar(200,0,0), -1, CV_AA);

  cv::namedWindow("drawing", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
  cv::imshow("drawing", img);
  cv::waitKey(0);
}

実行結果:

_images/ellipses.png

4.5 折れ線を描く

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

int
main(int argc, char *argv[])
{
  cv::Size img_size(500, 500);
  cv::Mat img = cv::Mat::zeros(img_size, CV_8UC3);
  cv::RNG gen(0xffffffff);
  
  int npt[] = {4, 4};
  cv::Point pt1[2][4];
  const cv::Point *ppt[2] = {pt1[0], pt1[1]};

  // Red
  for(int i=0; i<2; i++)
    for(int j=0; j<4; j++)
      pt1[i][j] = cv::Point(gen.uniform(0, img_size.width), gen.uniform(0, img_size.height));
  // 画像,折れ線頂点の配列の配列,頂点数の配列,折れ線数,線が閉じているか?,色,線太さ,種類
  cv::polylines(img, ppt, npt, 2, true, cv::Scalar(0,0,200), 3, 4);
  // Green
  for(int i=0; i<2; i++)
    for(int j=0; j<4; j++)
      pt1[i][j] = cv::Point(gen.uniform(0, img_size.width), gen.uniform(0, img_size.height));
  cv::polylines(img, ppt, npt, 2, true, cv::Scalar(0,200,0), 3, 8);
  // Blue
  for(int i=0; i<2; i++)
    for(int j=0; j<4; j++)
      pt1[i][j] = cv::Point(gen.uniform(0, img_size.width), gen.uniform(0, img_size.height));
  cv::polylines(img, ppt, npt, 2, false, cv::Scalar(200,0,0), 10, CV_AA);


  cv::namedWindow("drawing", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
  cv::imshow("drawing", img);
  cv::waitKey(0);
}

実行結果:

_images/polylines.png

4.6 ポリゴンを描く

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

int
main(int argc, char *argv[])
{
  cv::Size img_size(500, 500);
  cv::Mat img = cv::Mat::zeros(img_size, CV_8UC3);
  cv::RNG gen(0xffffffff);
  
  int npt[] = {4, 4};
  cv::Point pt1[2][4];
  const cv::Point *ppt[2] = {pt1[0], pt1[1]};

  // Red
  for(int i=0; i<2; i++)
    for(int j=0; j<4; j++)
      pt1[i][j] = cv::Point(gen.uniform(0, img_size.width), gen.uniform(0, img_size.height));
  // 画像,折れ線頂点の配列の配列,頂点数の配列,折れ線数,色,種類
  cv::fillPoly(img, ppt, npt, 2, cv::Scalar(0,0,200), 4);
  // Green
  for(int i=0; i<2; i++)
    for(int j=0; j<4; j++)
      pt1[i][j] = cv::Point(gen.uniform(0, img_size.width), gen.uniform(0, img_size.height));
  cv::fillPoly(img, ppt, npt, 2, cv::Scalar(0,200,0), 8);
  // Blue,
  for(int i=0; i<2; i++)
    for(int j=0; j<4; j++)
      pt1[i][j] = cv::Point(gen.uniform(0, img_size.width), gen.uniform(0, img_size.height));
  cv::fillPoly(img, ppt, npt, 2, cv::Scalar(200,0,0), CV_AA);


  cv::namedWindow("drawing", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
  cv::imshow("drawing", img);
  cv::waitKey(0);
}

実行結果:

_images/fillpoly.png

4.7 テキストを描く

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

int
main(int argc, char *argv[])
{
  cv::Mat img = cv::Mat::zeros(500, 500, CV_8UC3);
  
  int face[] = {cv::FONT_HERSHEY_SIMPLEX, cv::FONT_HERSHEY_PLAIN, cv::FONT_HERSHEY_DUPLEX, cv::FONT_HERSHEY_COMPLEX, 
                cv::FONT_HERSHEY_TRIPLEX, cv::FONT_HERSHEY_COMPLEX_SMALL, cv::FONT_HERSHEY_SCRIPT_SIMPLEX, 
                cv::FONT_HERSHEY_SCRIPT_COMPLEX, cv::FONT_ITALIC};

  // 画像,テキスト,位置(左下),フォント,スケール,色,線太さ,種類
  cv::putText(img, "OpenCV", cv::Point(50,50), face[0], 1.2, cv::Scalar(0,0,200), 2, CV_AA);
  cv::putText(img, "OpenCV", cv::Point(50,100), face[1], 1.2, cv::Scalar(0,200,0), 2, CV_AA);
  cv::putText(img, "OpenCV", cv::Point(50,150), face[2], 1.2, cv::Scalar(200,0,0), 2, CV_AA);
  cv::putText(img, "OpenCV", cv::Point(50,200), face[3], 1.2, cv::Scalar(0,100,100), 2, CV_AA);
  cv::putText(img, "OpenCV", cv::Point(50,250), face[4], 1.2, cv::Scalar(100,100,0), 2, CV_AA);
  cv::putText(img, "OpenCV", cv::Point(50,300), face[5], 1.2, cv::Scalar(100,0,100), 2, CV_AA);
  cv::putText(img, "OpenCV", cv::Point(50,350), face[6], 1.2, cv::Scalar(100,100,100), 2, CV_AA);
  cv::putText(img, "OpenCV", cv::Point(50,400), face[7], 1.2, cv::Scalar(100,100,200), 2, CV_AA);
  cv::putText(img, "OpenCV", cv::Point(300,50), face[0]|face[8], 1.2, cv::Scalar(100,200,100), 2, CV_AA);
  cv::putText(img, "OpenCV", cv::Point(300,100), face[1]|face[8], 1.2, cv::Scalar(200,100,100), 2, CV_AA);
  cv::putText(img, "OpenCV", cv::Point(300,150), face[2]|face[8], 1.2, cv::Scalar(200,200,100), 2, CV_AA);
  cv::putText(img, "OpenCV", cv::Point(300,200), face[3]|face[8], 1.2, cv::Scalar(200,100,200), 2, CV_AA);
  cv::putText(img, "OpenCV", cv::Point(300,250), face[4]|face[8], 1.2, cv::Scalar(100,200,200), 2, CV_AA);
  cv::putText(img, "OpenCV", cv::Point(300,300), face[5]|face[8], 1.2, cv::Scalar(100,200,255), 2, CV_AA);
  cv::putText(img, "OpenCV", cv::Point(300,350), face[6]|face[8], 1.2, cv::Scalar(100,255,200), 2, CV_AA);
  cv::putText(img, "OpenCV", cv::Point(300,400), face[7]|face[8], 1.2, cv::Scalar(255,200,100), 2, CV_AA);

  cv::namedWindow("drawing", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
  cv::imshow("drawing", img);
  cv::waitKey(0);
}

実行結果:

_images/draw_text.png