从矢量<point2f>创建垫子

  • 本文关键字:创建 point2f c++ opencv
  • 更新时间 :
  • 英文 :


我对计算机视觉和opencv库非常陌生。

我已经做了一些谷歌周围试图找到如何从Point2fs的矢量制作一个新的图像,并没有发现任何工作的例子。我已经看到了vector<Point>Mat,但是当我使用这些例子时,我总是得到错误。

我正在从这个例子中工作,任何帮助都会很感激。

代码:I pass in occludedSquare.

   resize(occludedSquare, occludedSquare, Size(0, 0), 0.5, 0.5);
   Mat occludedSquare8u;
   cvtColor(occludedSquare, occludedSquare8u, CV_BGR2GRAY);
   //convert to a binary image. pixel values greater than 200 turn to white. otherwize black
   Mat thresh;
   threshold(occludedSquare8u, thresh, 170.0, 255.0, THRESH_BINARY);

   GaussianBlur(thresh, thresh, Size(7, 7), 2.0, 2.0);
   //Do edge detection
   Mat edges;
   Canny(thresh, edges, 45.0, 160.0, 3);
   //Do straight line detection
   vector<Vec2f> lines;
   HoughLines( edges, lines, 1.5, CV_PI/180, 50, 0, 0 );
   //imshow("thresholded", edges);

   cout << "Detected " << lines.size() << " lines." << endl;
   // compute the intersection from the lines detected...
   vector<Point2f> intersections;
   for( size_t i = 0; i < lines.size(); i++ )
   {
       for(size_t j = 0; j < lines.size(); j++)
       {
           Vec2f line1 = lines[i];
           Vec2f line2 = lines[j];
           if(acceptLinePair(line1, line2, CV_PI / 32))
           {
               Point2f intersection = computeIntersect(line1, line2);
               intersections.push_back(intersection);
           }
       }
   }
   if(intersections.size() > 0)
   {
       vector<Point2f>::iterator i;
       for(i = intersections.begin(); i != intersections.end(); ++i)
       {
           cout << "Intersection is " << i->x << ", " << i->y << endl;
           circle(occludedSquare8u, *i, 1, Scalar(0, 255, 0), 3);
       }
   }
//Make new matrix bounded by the intersections
...
imshow("localized", localized);

应该像

一样简单
std::vector<cv::Point2f> points;
cv::Mat image(points);
//or
cv::Mat image = cv::Mat(points) 

可能的混淆是cv::Mat是通道的图像width*height*number,但它也是一个数学矩阵rows*columns*other dimension

如果你从n个2D点的向量中创建一个Mat,它将创建一个2列乘n行矩阵。您正在将此参数传递给需要图像的函数。

如果你只是有一个分散的2D点集,并希望将它们显示为图像,你需要制作一个足够大的空cv::Mat(无论你的最大x,y点是什么),然后使用绘图函数http://docs.opencv.org/doc/tutorials/core/basic_geometric_drawing/basic_geometric_drawing.html绘制点

如果你只是想设置像素值在那些点坐标搜索SO为opencv设置像素值,有很多答案

Martin的回答是对的,但在我看来,这取决于imagecv::Mat如何进一步使用。我遇到了一些问题,浩峰的评论帮助我解决了这些问题。下面是我对它的详细解释:

假设代码是这样的:

  std::vector<cv::Point2f> points = {cv::Point2f(1.0, 2.0), cv::Point2f(3.0, 4.0), cv::Point2f(5.0, 6.0), cv::Point2f(7.0, 8.0), cv::Point2f(9.0, 10.0)};
  cv::Mat image(points);  // or cv::Mat image = cv::Mat(points) 
  std::cout << image << std::endl;

这将打印:

[1, 2;
 3, 4;
 5, 6;
 7, 8;
 9, 10]

所以,乍一看,这看起来完全正确,正如预期的那样:对于给定vector中的五个2D点,我们得到了一个5行2列的cv::Mat,对吗?然而,这里的情况并非如此!

如果进一步检查属性:

  std::cout << image.rows << std::endl;  // 5
  std::cout << image.cols << std::endl;  // 1
  std::cout << image.channels() << std::endl;  // 2

可以看出,上面的cv::Mat有5行,1列2通道。根据管道的情况,我们可能不希望这样。大多数情况下,我们想要一个矩阵有5行,2列,只有一个通道。

要解决这个问题,我们所需要做的就是将矩阵reshape:

  cv::Mat image(points).reshape(1);

在上面的代码中,1用于1通道。查看OpenCV reshape()文档获取更多信息。

如果这个矩阵被打印出来,它看起来将与前一个相同。然而,这还不是全部(打个比方!)新的矩阵有5行,2列1通道

我希望OpenCV有不同的方式打印出这两个相似但不同的矩阵(从OpenCV数据结构的角度来看)!

相关内容

  • 没有找到相关文章

最新更新