Manipulating pixels with OpenCV

Scalar intensity = img.at<uchar>(y, x);
intensity.val[0]contains a value from 0 to 255. Note the ordering ofxandy. Since in OpenCV images are
represented by the same structure as matrices, we use the same convention for both cases - the 0-based row index
(or y-coordinate) goes first and the 0-based column index (or x-coordinate) follows it. Alternatively, you can use the
following notation:
Scalar intensity = img.at<uchar>(Point(x, y));
Now let us consider a 3 channel image withBGRcolor ordering (the default format returned byimread):
Vec3b intensity = img.at<Vec3b>(y, x);
uchar blue = intensity.val[0];
uchar green = intensity.val[1];
uchar red = intensity.val[2];
You can use the same method for floating-point images (for example, you can get such an image by running Sobel on
a 3 channel image):
Vec3f intensity = img.at<Vec3f>(y, x);
float blue = intensity.val[0];
float green = intensity.val[1];
float red = intensity.val[2];
The same method can be used to change pixel intensities:
img.at<uchar>(y, x) = 128;
There are functions in OpenCV, especially from calib3d module, such asprojectPoints, that take an array of 2D or
3D points in the form ofMat. Matrix should contain exactly one column, each row corresponds to a point, matrix type
should be 32FC2 or 32FC3 correspondingly. Such a matrix can be easily constructed fromstd::vector:
vector<Point2f> points;
//... fill the array
Mat pointsMat = Mat(points);
One can access a point in this matrix using the same method texttt{Mat::at}:
Point2f point = pointsMat.at<Point2f>(i, 0);

posted on 2012-07-03 14:06  Never more  阅读(371)  评论(0编辑  收藏  举报

导航