Доступ к пикселям в 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
}
}
Ответы
Ответ 1
В opencv 2.2 я бы использовал интерфейс С++.
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;
}
}
Ответ 2
Структура IplImage имеет переменную char* imageData
- это просто буфер всех пикселей. Чтобы правильно его прочитать, вы должны знать свой формат изображения. Например, для RGB888 image 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
Ответ 3
IplImage - это старый формат изображений. Вы должны использовать новый формат CvMat, который может хранить произвольные матрицы. В конце концов, это всего лишь матрица.
Затем вы можете получить доступ к пикселям, используя функцию cvGet2D, которая возвращает CvScalar.