Я пытаюсь с помощью этого кода вычислить значение пикселей моего двоичного изображения по этому коду:

int main()
{
    Mat img;

    img=imread("/home/2b.jpeg", CV_LOAD_IMAGE_UNCHANGED);
    namedWindow("win", WINDOW_AUTOSIZE);
    imshow("win", img);

    for(int i=0; i< img.rows ;i++)
    {
        for(int j=0; j< img.cols ; j++)
        {
            cout<<setw(10)<<img.at<int>(i,j);
        }
        cout<<endl<<endl<<endl;
    }

    waitKey(0);

    return 0;
}

Но я получаю 3 типа значений: 0, -1 и несколько разных чисел, например (24342234, 1324244242 и т. Д.).

В чем проблема? Я нарисовал одну черную линию в программах рисования и сохранил изображение или загрузил двоичное изображение из Интернета, но получаю те же результаты!

Я думал, что когда я использую двоичные изображения, я должен получить 0 для белых пикселей и 255 для черных.

1
user3486308 9 Май 2014 в 08:13

3 ответа

Лучший ответ

Во-первых, вы должны получить доступ к его пикселям с типом uchar (unsigned char) вместо int.

И когда cout, вы должны явно преобразовать его в другие типы, такие как int, чтобы печатать его правильно, потому что cout будет работать странно при печати unsigned char, когда его значение больше, чем 127. В противном случае он напечатает какое-то значение мусора (или ничего), поскольку это просто непечатаемый символ ASCII , который все равно печатается. Ознакомьтесь с Почему cout странно работает с unsigned char?.

cout << setw(10) << (int) img.at<uchar>(i,j);
                    ^^^^^        ^^^^^             
2
Community 23 Май 2017 в 12:14

Вы пытаетесь получить доступ к целочисленному значению, в то время как на самом деле ваш мат - uchar. Попробуйте изменить внутреннюю строку цикла на:

cout<<setw(10)<<img.at<uchar>(i,j);
0
bheliom 9 Май 2014 в 04:35

Попробуйте загрузить его как CV_IMAGE_GRAYSCALE и получить доступ к значениям пикселей с помощью image.at< uchar>(y,x).

0
edu_ 9 Май 2014 в 16:16