Pixel access in OpenCV 2.2
Hi I want to use opencv to tell me the pixel values of a blank and white image so the output would look like this
10001
00040
11110
00100
Here is my current code but I'm not sure how to access the results of the CV_GET_CURRENT
call.. any help ?
IplImage readpix(IplImage* m_image) {
cout << "Image width : " << m_image->width << "n";
cout << "Image height : " << m_image->height << "n";
cout << "-----------------------------------------n";
CvPixelPosition8u position;
CV_INIT_PIXEL_POS(position, (unsigned char*)(m_image->imageData), m_image->widthStep, cvSize(m_image->width, m_image->height), 0, 0, m_image->origin);
for(int y = 0; y < m_image->height; ++y) // FOR EACH ROW
{
for(int x = 0; x < m_image->width; ++x) // FOR EACH COL
{
CV_MOVE_TO(position, x, y, 1);
unsigned char colour = *CV_GET_CURRENT(position, 1);
// I want print 1 for a black pixel or 0 for a white pixel
// so i want goes here
}
cout << " n"; //END OF ROW
}
}
在opencv 2.2中,我会使用C ++接口。
cv::Mat in = /* your image goes here,
assuming single-channel image with 8bits per pixel */
for(int row = 0; row < in.rows; ++row) {
unsigned char* inp = in.ptr<unsigned char>(row);
for (int col = 0; col < in.cols; ++col) {
if (*inp++ == 0) {
std::cout << '1';
} else {
std::cout << '0';
}
std::cout << std::endl;
}
}
IplImage struct have a variable char* imageData
- it's just a buffer of all pixels. To read it properly you have to know your image format. For example for RGB888 image 3 first chars in imageData array will represent the r,g,b values of the first pixel at the first row. If you know the image format - you can read the data properly. Image format can be restored reading another values of IplImage structure:
http://opencv.willowgarage.com/documentation/basic_structures.html
Also i think it's more efficient to write the loop like this:
uchar r,g,b;
for (int y = 0; y < cvFrame->height; y++)
{
uchar *ptr = (uchar*) (cvFrame_->imageData + y*cvFrame_->widthStep);
for (int x = 0; x < cvFrame_->width; x++)
{
r = ptr[3*x];
g = ptr[3*x + 1];
b = ptr[3*x + 2];
}
}
This code is for RGB888 image
IplImage is the old format for images. You should use the new format, CvMat, which can store arbitrary matrices. An image is just a matrix, after all.
You can then access the pixels using the function cvGet2D, which returns a CvScalar.
链接地址: http://www.djcxy.com/p/67000.html上一篇: 在openCV中访问某个像素的RGB值
下一篇: OpenCV 2.2中的像素访问