2014-02-04 3 views
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..» появится в подсказке, когда окна попросят сломать или продолжить поток.

И в командной консоли, где 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, так что все в порядке. – berak

+0

ya berak thats true..and plz post решение ребята .. – Santhosh

ответ

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

спасибо beark, u производства мой день .. !! и вывод похож на [int, int, int] в каждом пикселе, вот что я могу узнать, как я могу постоянно получать и изменять значения навсегда и сохранять их на одном и том же изображении и отображать их. Если вы можете пинговать некоторые ссылки, которые было бы здорово. и thenq для последнего ответа снова. – Santhosh

+0

используйте ссылку: 'Vec3b & pixel = ptr [j]; pixel [1] = 255; 'green теперь заполнен или просто' ptr [j] [1] = 255; ' – berak

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

hi RyanLiu на самом деле, когда писал ваши строки по моему коду, я получил ошибку, например:« указатель на связанная функция может использоваться только для вызова функции «, может ли PLZ заглядывать в нее ... – Santhosh

+0

@ user2978527 Извините за ошибку издания, источник« img.ptr [j] (i) (0) »для доступа к изображению необходимо изменить на новую версию версии "img.ptr (j) [i] [0]", и я уже исправил ошибки. Дополнительная информация http://stackoverflow.com/a/21346778/2469488 – RyanLiu

Смежные вопросы