9

I am extremely new to computer vision and the opencv library.

I've done some googling around to try to find how to make a new image from a vector of Point2fs and haven't found any examples that work. I've seen vector<Point> to Mat but when I use those examples I always get errors.

I'm working from this example and any help would be appreciated.

Code: 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);
Community
  • 1
  • 1
myselfesteem
  • 683
  • 1
  • 6
  • 21
  • I want to take the points I have to create an ROI and from there make a new matrix. Is that more clear? I'm not really sure what the difference between making a Mat of points and drawing points into a matrix is. – myselfesteem May 10 '14 at 19:12

1 Answers1

16

Should be as simple as

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

The probably confusion is that a cv::Mat is an image width*height*number of channels but it also a mathematical matrix , rows*columns*other dimension.

If you make a Mat from a vector of 'n' 2D points it will create a 2 column by 'n' rows matrix. You are passing this to a function which expects an image.

If you just have a scattered set of 2D points and want to display them as an image you need to make an empty cv::Mat of large enough size (whatever your maximum x,y point is) and then draw the dots using the drawing functions http://docs.opencv.org/doc/tutorials/core/basic_geometric_drawing/basic_geometric_drawing.html

If you just want to set the pixel values at those point coordinates search SO for opencv setting pixel values, there are lots of answers

Kevin Katzke
  • 3,203
  • 3
  • 34
  • 44
Martin Beckett
  • 92,791
  • 27
  • 183
  • 258
  • 3
    I get a runtime error "Bad number of channels (Source image must have 1, 3 or 4 channels) in cvConvertImage, ... )" for both of these options. – myselfesteem May 10 '14 at 19:23
  • I may have been unclear in the problem statement, but I fixed it by creating an ROI then cropping my matrix with that. I made the ROI by finding the smallest x & y values. Then I could compute the height and width. I'm marking you as correct answer because you led me to the right path. – myselfesteem May 11 '14 at 19:43
  • 1
    `cv::Mat(points).reshape(1)` give you the exactly (rows, cols) by setting channel to 1. – Zhengfang Xin Nov 05 '21 at 14:30