myselfesteem myselfesteem - 1 year ago 105
C++ Question

Create Mat from vector<point2f>

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

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);


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);

Answer Source

Should be as simple as

std::vector<cv::Point2f> points;
cv::Mat image(points);
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

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

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download