OpenCV 2.2中的像素访问

您好我想使用opencv来告诉我一个空白和白色图像的像素值,所以输出看起来像这样

10001 00040 11110 00100 

这是我目前的代码,但我不知道如何访问CV_GET_CURRENT调用的结果..任何帮助?

 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结构有一个variableschar* imageData – 它只是一个所有像素的缓冲区。 要正确阅读,你必须知道你的图像格式。 例如,对于RGB888图像3,imageData数组中的第一个字符将表示第一行第一个像素的r,g,b值。 如果您知道图像格式 – 可以正确读取数据。 图像格式可以恢复读取IplImage结构的另一个值:

http://opencv.willowgarage.com/documentation/basic_structures.html

另外我认为这样写循环更有效率:

 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]; } } 

此代码适用于RGB888图像

IplImage是图像的旧格式。 你应该使用新的格式,CvMat,它可以存储任意matrix。 毕竟,图像只是一个matrix。

然后可以使用函数cvGet2D来访问像素,该函数返回一个CvScalar。