OpenCV Pixel Display-Wert
Habe ich folgenden code. Wenn ich das Programm starte, unbekannte Zeichen anstelle von pixel-Werten kommt, auf dem Bildschirm. Ich möchte die display-pixel Werte. Wie mache ich das? Danke.
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat image = imread("/home/fd/baby.jpg");
for( int i = 0 ; i < image.rows ; i++)
{
for( int j = 0 ; j < image.cols ; j++ )
{
if(image.type() == CV_8UC1)
{
image.at<uchar>(i,j) = 255;
}
else if(image.type() == CV_8UC3)
{
cout << image.at<Vec3b>(i,j)[0] << " " << image.at<Vec3b>(i,j)[1] << " " << image.at<Vec3b>(i,j)[2] << endl;
image.at<Vec3b>(i,j)[0] = 255;
image.at<Vec3b>(i,j)[1] = 255;
image.at<Vec3b>(i,j)[2] = 255;
cout << image.at<Vec3b>(i,j)[0] << " " << image.at<Vec3b>(i,j)[1] << " " << image.at<Vec3b>(i,j)[2] << endl;
}
else
{
cout << "Anknown image format" << endl;
return 0;
}
}
}
imshow("Result İmage", image);
waitKey(0);
}
Dies ist das Ergebnis Bildschirm:
- möglich, Duplikat der Warum ist std::cout Druck nicht der richtige Wert für meine int8_t Zahl?
- Aber Sie wissen, Bild der Pixel Werte zwischen 0 und 255. Also ich denke mein problem ist nicht signiert oder unsigniert-pixel-Wert.
cout << int(uchar_value);
aber besser noch, drucken Sie einfach die ganze Matte:cout << img << endl;
- Es geht nicht darum, signed oder unsigned. Jeder Geschmack
char
gedruckt, wie ein einzelnes Zeichen, das nicht eine Reihe von Standard. Die Förderung der zu einer größeren Art verhindert dies. (Wenncout << 'A'
gedruckt 65 es würde zu Verwirrung führen. Schuld Abwärtskompatibilität.) - Danke @berak, ich habe mein problem gelöst wity Ihre Antwort. Danke. cout << int(Bild.at<Vec3b>(i,j)[0])
- mögliche Duplikate von Warum "cout" funktioniert komisch für "unsigned char"?
Vec3b
istVec<uchar, 3>
, nichtVec<int8_t, 3>
. So ist es nicht eine doppelte, was Sie link. 🙂- warum sind Sie zuweisen 255 jedes mal?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Besetzung jeder der Ausgänge an eine integer -
änderung
Dem Sie drucken, ein
char
(oder wahrscheinlichunsigned char
), die gedruckt wird, durch den Strom wie ein einzelnes Zeichen (die auf den 255 sieht, was Sie sehen möchten). Castint
Kräfte, die Sie zur Anzeige die numerische Darstellung des Wertes.Den anderen Antworten ändern der
image.at<type>
änderungen, wie die raw-Daten interpretiert werden; tun Sie das nicht. Sie müssen richtig interpretiert werden.Ändern Sie die
image.at<Vec3b>(i, j)
zu
image.at<int>(i, j)
oder
image.at<double>(i, j)
oder
image.at<float>(i, j)
drucken der Werte statt Zeichen
Vec3b px= Bild.bei(x,y);
cout << "Wert: ("<<(int)px.val[0]<<", "<<(int)px.val[1]<<", "<<(int)px.val[2]<<")" << endl;
Das funktioniert für mich.
Sind Sie die Anzeige von Zeichen versuchen Sie die Konvertierung mit der Funktion
image.at<int>(j,i);