Чтение значений данных пикселей из файла растрового изображения

0

вот код, который я написал в c++

  int main()
   {
    Mat im = imread("C:/santhu/bitmap.bmp");

int rows = im.rows;
   int cols = im.cols;

cout<<"rows\n"<<rows;
cout<<"cols"<<cols;

if (im.empty()) 
 {
     cout << "Cannot load image!" << endl;
    return -1;
}


cout<<"the output for matrix of pixels";

for (int i = 0; i <cols ; i++)
{
    Vec3b *ptr = im.ptr<Vec3b>(i);
    for (int j = 0; j < rows; j++)
    {   
        Vec3b pixel = ptr[j];
        cout<<pixel<<"\t";
    }
    cout<<"\n";
}

getchar();
 imshow("Image", im);
waitKey(0);
}

код работает отлично до тех пор, пока он не покажет все значения пикселей в терминах Vec3b, но, наконец, Unhandled exception at 0x75afb9bc in san.exe: Microsoft c++ exception: cv::Exception at memory location 0x0043f9d0.. исключение типа " Unhandled exception at 0x75afb9bc in san.exe: Microsoft c++ exception: cv::Exception at memory location 0x0043f9d0.. " в подсказке окна просит сломать или продолжить поток

И в командной консоли, где im получает значения пикселей, которые будут отображаться, в этом он показывает мне как opencv error:assertion failed(y==0 ||(data && dims)=1 &&(unsigned) y <(unsigned)size.p[0] in cv::Mat::ptr,file c:\opencv\build\include\opencv2\core\mat.hpp,line 428, после отображения данных пикселей.

я проверил целую сеть и mat.hpp также дал встроенную функцию, поэтому я разочарован, может кто-нибудь объяснить эту ошибку (исключение) и помочь мне запустить код только до тех пор, пока пиксели данных не станут их в растровом изображении и не будут выполнены nicely.plz

  • 0
    Вы предполагаете, не проверяя и не требуя, чтобы массив содержал пиксели Vec3b.
  • 0
    Дэвид, флаг по умолчанию для imread принудительно выставит его в CV_8UC3, так что все в порядке.
Показать ещё 1 комментарий
Теги:
opencv
visual-studio-2010
bitmap

2 ответа

2
Лучший ответ

вы путаете строки и столбцы здесь.

for (int i = 0; i <rows; i++)       // rows, not cols
{
    Vec3b *ptr = im.ptr<Vec3b>(i);
    for (int j = 0; j < cols; j++)  // cols, not rows
    {   
        Vec3b pixel = ptr[j];
        cout<<pixel<<"\t";
    }
    cout<<"\n";
}
  • 0
    спасибо, ты сделал мой день .. !! и вывод похож на [int, int, int] в каждом пикселе, дело здесь в том, что как я могу получить доступ и изменить значения навсегда и сохранить обратно в том же изображении и отобразить его ... если вы можете пропинговать некоторые ссылки, которые было бы здорово. и еще раз спасибо за последний ответ.
  • 0
    используйте ссылку: `Vec3b & pixel = ptr [j]; pixel [1] = 255; `зеленый заполнен сейчас или просто ptr[j][1] = 255;
1

Цветной формат

for(int j = 0; j < img.rows; j++) {
   for(int i = 0; i < img.cols; i++) {

      uchar b = img.ptr<cv::Vec3b>(j)[i][0];
      ucahr g = img.ptr<cv::Vec3b>(j)[i][1]; 
      uchar r = img.ptr<cv::Vec3b>(j)[i][2]; 

      std::cout << "b = " << (int) b << std::endl
                << "g = " << (int) g << std::endl
                << "r = " << (int) r << std::endl;

    }
 }

Серый формат

cv::Mat img;
cv::cvtColor(src,img,CV_BGR2RGB);

for(int j = 0; j < img.rows; j++) {
   for(int i = 0; i < img.cols; i++) {
      std::cout << "gray value = " << img.ptr<uchar>(j)[i] << std::endl;
   }
}
  • 0
    Привет RyanLiu на самом деле, когда писал ваши строки в моем коде, я получил ошибку вроде: «указатель на связанную функцию может быть использован только для вызова функции», вы можете посмотреть это ...
  • 0
    @ user2978527 извините за ошибку в издании, исходное имя "img.ptr <cv :: Vec3> [j] (i) (0)" для доступа к изображению необходимо заменить на новую версию издания "img.ptr <cv :: Vec3> (j) [i] [0] ", и я уже исправил ошибки. Дополнительная информация: stackoverflow.com/a/21346778/2469488

Ещё вопросы

Сообщество Overcoder
Наверх
Меню