Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在opencv中的Aruco标记上绘制矩形?_C++_Opencv_Draw_Aruco - Fatal编程技术网

C++ 如何在opencv中的Aruco标记上绘制矩形?

C++ 如何在opencv中的Aruco标记上绘制矩形?,c++,opencv,draw,aruco,C++,Opencv,Draw,Aruco,我有一个程序来绘制和检测阿鲁科标记,并在上面写下标记id。我需要在每个标记上显示一个矩形,而不是标记id,我可以在标记上的固定位置绘制一个矩形,代码如下: #include <opencv2\highgui.hpp> #include <opencv2\aruco.hpp> #include <opencv2\core.hpp> #include <opencv2\imgcodecs.hpp> #include <opencv2\imgpro

我有一个程序来绘制和检测阿鲁科标记,并在上面写下标记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;
        }
    }
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间cv;
使用名称空间std;
int main(int argc,char*argv[]){
cv::视频捕获输入视频;
输入视频。打开(0);
Mat输出标记;
自动标记DICT=aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME::DICT_4X4_50);
对于(int i=0;i<50;i++){
aruco::drawMarker(markerDict,i,500,outputMarker,1);
ostringstream转换;
字符串imageName=“4x4marker_389;”;
convert当您使用该函数时,它将返回每个检测的角点。在您的情况下,您将其放入
std::vector corners
。要绘制您要求的矩形,您可以执行类似的操作(以下代码是一个示例,未经测试):

这是您将通过以下代码获得的输出:

当您使用该函数时,它返回每个检测的角点。在您的情况下,您将其放入
std::vector corners
中。要绘制您要求的矩形,您可以执行类似的操作(以下代码是一个示例,尚未测试过)):

这是您将通过以下代码获得的输出:
@apalomer

@apalomer

你想要一个绘制矩形还是一个每个检测点都有四个角的多边形?@apalomer是的,或者每个标记上至少有一个矩形是一个多边形还是一个矩形?此外,你想要填充它还是仅仅填充轮廓?任何形状,最好填充,谢谢。你想要绘制矩形还是多边形每个检测的四个角?@apalomer是的,或者每个标记上至少有一个矩形是多边形还是矩形?此外,您希望填充它还是仅填充轮廓?任何形状,最好填充,谢谢。如果这个问题解决了,请向上投票和/或接受答案。这会给我一条信息,告诉我在Link.exe的0x000和FF917C799中未处理的异常:微软C++异常:CV::内存位置0x000,41320FD740发生异常。"我没有任何图像可以调试和测试代码。如果你可以发送一个图像,我可以测试和查看。向你的问题添加一个图像。一个包含标记的图像,而不仅仅是标记。我用该图像编辑了文章,我不明白包含标记的图像是什么意思,我在标记周围画了一个白色边框。向上投票和/或访问请回答这个问题,如果它是这个问题,它会给我一个信息:“Link.exe的0x00 00 FF917C75 29 9未处理的异常:微软C++异常:CV::内存位置异常,0x00,000,41320FD740。”我没有任何图像可以调试和测试代码。如果你可以发送一个图像,我可以测试和查看。在你的问题中添加一个图像。一个包含标记的图像,而不仅仅是标记。我用该图像编辑了文章,我不明白包含标记的图像是什么意思,我在标记周围画了一个白色边框。
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);
}
#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;
}