opencvのArucoマーカーに長方形を描く方法は?

マハモヒ

アルコマーカーを描いて検出し、マーカーIDを書き込むプログラムがあります。マーカーIDの代わりに各マーカーに長方形を表示する必要があります。長方形を描画できますが、マーカー上ではなく固定位置にあります。コードは次のとおりです。

#include <opencv2\highgui.hpp>
#include <opencv2\aruco.hpp>
#include <opencv2\core.hpp>
#include <opencv2\imgcodecs.hpp>
#include <opencv2\imgproc.hpp>
#include <opencv2\calib3d.hpp>
#include <sstream>
#include <fstream>
#include <iostream>
using namespace cv;
using namespace std;


int main(int argc, char *argv[]) {
    cv::VideoCapture inputVideo;
    inputVideo.open(0);
    Mat outputMarker;
    auto  markerDict = aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME::DICT_4X4_50);
    for (int i = 0; i < 50; i++) {
        aruco::drawMarker(markerDict, i, 500, outputMarker, 1);
        ostringstream convert;
        String imageName = "4x4marker_";
        convert << imageName << i << ".jpg";
        imwrite(convert.str(), outputMarker);

        while (inputVideo.grab()) {
            cv::Mat image, imageCopy;
            inputVideo.retrieve(image);
            image.copyTo(imageCopy);

            std::vector<int> ids;
            std::vector<std::vector<cv::Point2f> > corners;
            cv::aruco::detectMarkers(image, markerDict, corners, ids);

            // if at least one marker detected
            if (ids.size() > 0)
                cv::aruco::drawDetectedMarkers(imageCopy, corners, ids);
            int x = 0;
            int y = 3;


            rectangle(imageCopy, Point(imageCopy.cols/2, imageCopy.rows/2),
                Point(x,y),Scalar::all(255), -1, 8, 0);



            cv::imshow("out", imageCopy);
            char key = (char)cv::waitKey(5);
            if (key == 27)
                break;
        }
    }
}

コードテストを容易にするためのマーカーの例。

ここに

アパロマー

このdetectMarkers関数を使用すると、各検出のコーナーが返されます。あなたの場合、あなたはそれをに入れていstd::vector<std::vector<cv::Point2f> > cornersます。要求する長方形を描画するには、次のような操作を実行できます(次のコードは例であり、テストされていません)。

for (size_t i = 0; i< corners.size(); +i)
{
  cv::Point2f p0(image.cols,image.rows);
  cv::Ponit2f p1(0,0);
  for (auto p: corners[i])
  {
    if (p.x < p0.x)
      p0.x = p.x;
    if (p.y < p0.y)
      p0.y = p.y;
    if (p.x > p1.x)
      p1.x = p.x;
    if (p.y > p1.y)
      p1.y = p.y;
  }
  rectangle(imageCopy, p0, p1,Scalar::all(255), -1, 8, 0);
}

ただし、マーカーがカメラの光軸に完全に垂直でなく、歪みがない場合、画像上のマーカーの投影は長方形にならないため、マーカーにより適したポリゴンを描画することをお勧めします。そのためには、を使用できますfillPoly。または、入力したくない場合はを使用できますline

以下は、UbuntuではOpenCV 4.3.0-preと3.2.0、Windowsでは3.4.9でテストされた完全に機能する例です。

#include <iostream>

#include <opencv2/aruco.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

int main(int argc, char** argv)
{
  // Check cv versionmake
  std::cout << "Using OpenCV version: " << CV_VERSION << std::endl;

  // Create video input
  cv::VideoCapture inputVideo;
  int input_source(0);
  if (argc > 1)
    input_source = std::atoi(argv[1]);
  if (!inputVideo.open(input_source))
  {
    std::cerr << "Error opening input video soruce: " << input_source << std::endl;
    return EXIT_FAILURE;
  }

  // Create marker dictionary
  auto marker_dict = cv::aruco::getPredefinedDictionary(cv::aruco::PREDEFINED_DICTIONARY_NAME::DICT_4X4_50);

  // Get imshow ready
  cv::namedWindow("Display window", cv::WINDOW_KEEPRATIO | cv::WINDOW_NORMAL);
  cv::resizeWindow("Display window", 800, 600);

  // Grab images until escape is pressed
  int key = 0;
  while (key != 27 && inputVideo.grab())
  {
    // Retrieve image
    cv::Mat image;
    inputVideo.retrieve(image);

    // Get image output ready
    cv::Size image_size = image.size();
    cv::Mat out_image(image_size.height, 3 * image_size.width, CV_8UC3);
    cv::Mat left(out_image, cv::Rect(0, 0, image_size.width, image_size.height));
    image.copyTo(left);
    cv::Mat mid(out_image, cv::Rect(image_size.width, 0, image_size.width, image_size.height));
    image.copyTo(mid);
    cv::Mat right(out_image, cv::Rect(2 * image_size.width, 0, image_size.width, image_size.height));
    image.copyTo(right);

    // Add names to images
    int corner_offset = 50;
    cv::putText(left, "Original image", cv::Point(corner_offset, corner_offset), cv::FONT_HERSHEY_DUPLEX, 1.0,
                CV_RGB(0, 0, 0), 2);
    cv::putText(mid, "Image with OpenCV drawing", cv::Point(corner_offset, corner_offset), cv::FONT_HERSHEY_DUPLEX, 1.0,
                CV_RGB(0, 0, 0), 2);
    cv::putText(right, "Image with custom drawing", cv::Point(corner_offset, corner_offset), cv::FONT_HERSHEY_DUPLEX,
                1.0, CV_RGB(0, 0, 0), 2);

    // Detect markers
    std::vector<int> ids;
    std::vector<std::vector<cv::Point2f> > corners;
    cv::aruco::detectMarkers(image, marker_dict, corners, ids);

    // Draw markers using opencv tool
    cv::aruco::drawDetectedMarkers(mid, corners, ids);

    // Draw markers custom
    for (size_t i = 0; i < corners.size(); ++i)
    {
      // Convert to integer ponits
      int num = static_cast<int>(corners[i].size());
      std::vector<cv::Point> points;
      for (size_t j = 0; j < corners[i].size(); ++j)
        points.push_back(cv::Point(static_cast<int>(corners[i][j].x), static_cast<int>(corners[i][j].y)));
      const cv::Point* pts = &(points[0]);

      // Draw
      cv::fillPoly(right, &pts, &num, 1, cv::Scalar(255, 0, 0));

      // Draw contour
      for (size_t j = 0; j < corners[i].size(); ++j)
      {
        size_t next = (j + 1) % corners[i].size();
        cv::line(right, corners[i][j], corners[i][next], cv::Scalar(0, 255, 0), 5);
      }
    }

    // Display
    cv::imshow("Display window", out_image);
    key = cv::waitKey(5);
  }

  return EXIT_SUCCESS;
}

これは、このコードで得られる出力です。 ここに画像の説明を入力してください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Javaでマウスカーソルの周りに長方形を描く方法は?

分類Dev

長方形の半円をフラッターで描く方法は?

分類Dev

画像上にマウスで複数の長方形を描く方法は?

分類Dev

SWIFTでカスタムの角丸長方形を描く方法は?

分類Dev

Javaでカスタムの角丸長方形を描く方法は?

分類Dev

長方形の中に長方形を描く

分類Dev

ポーズのキーポイントの周りに長方形を描く方法は?

分類Dev

点のセットの上に長方形を描く方法は?

分類Dev

imagejで16x16の長方形のテーブルを描く方法は?

分類Dev

顔の位置に長方形を描く方法は?

分類Dev

マウスを動かしてSVGに長方形を描く方法は?

分類Dev

Kotlinで長方形を描く方法は?

分類Dev

長方形に弧を描くには?

分類Dev

matplotlib:画像に長方形を描く方法

分類Dev

ReactNativeで画像に長方形を描く方法

分類Dev

Matlabで多くの長方形を描く方法は?

分類Dev

プロットのプロット線の下に長方形を描く方法は?

分類Dev

額入りの長方形をキャンバスに描く方法は?

分類Dev

画像の上に長方形を描くブラウザフレンドリーな方法Rシャイニー

分類Dev

画面の中央に長方形を描く

分類Dev

画像に複数の長方形を描く

分類Dev

Pysimpleguiの画像に長方形を描く

分類Dev

4つの座標を使用して長方形を描く方法は?

分類Dev

動的な長方形を階層的に描く方法は? (MVVM-WPF)

分類Dev

GoogleマップのSVG点滅長方形または円の境界線画像にマーカーを含める方法

分類Dev

Xamarin.iOSで角の丸い長方形を描く方法は?

分類Dev

半円形の長方形を描く方法は?

分類Dev

Javaで矢印の付いた長方形を描く方法は?

分類Dev

2点の周りに長方形を描く方法

Related 関連記事

  1. 1

    Javaでマウスカーソルの周りに長方形を描く方法は?

  2. 2

    長方形の半円をフラッターで描く方法は?

  3. 3

    画像上にマウスで複数の長方形を描く方法は?

  4. 4

    SWIFTでカスタムの角丸長方形を描く方法は?

  5. 5

    Javaでカスタムの角丸長方形を描く方法は?

  6. 6

    長方形の中に長方形を描く

  7. 7

    ポーズのキーポイントの周りに長方形を描く方法は?

  8. 8

    点のセットの上に長方形を描く方法は?

  9. 9

    imagejで16x16の長方形のテーブルを描く方法は?

  10. 10

    顔の位置に長方形を描く方法は?

  11. 11

    マウスを動かしてSVGに長方形を描く方法は?

  12. 12

    Kotlinで長方形を描く方法は?

  13. 13

    長方形に弧を描くには?

  14. 14

    matplotlib:画像に長方形を描く方法

  15. 15

    ReactNativeで画像に長方形を描く方法

  16. 16

    Matlabで多くの長方形を描く方法は?

  17. 17

    プロットのプロット線の下に長方形を描く方法は?

  18. 18

    額入りの長方形をキャンバスに描く方法は?

  19. 19

    画像の上に長方形を描くブラウザフレンドリーな方法Rシャイニー

  20. 20

    画面の中央に長方形を描く

  21. 21

    画像に複数の長方形を描く

  22. 22

    Pysimpleguiの画像に長方形を描く

  23. 23

    4つの座標を使用して長方形を描く方法は?

  24. 24

    動的な長方形を階層的に描く方法は? (MVVM-WPF)

  25. 25

    GoogleマップのSVG点滅長方形または円の境界線画像にマーカーを含める方法

  26. 26

    Xamarin.iOSで角の丸い長方形を描く方法は?

  27. 27

    半円形の長方形を描く方法は?

  28. 28

    Javaで矢印の付いた長方形を描く方法は?

  29. 29

    2点の周りに長方形を描く方法

ホットタグ

アーカイブ