2016-07-16 16 views
2

Ich schrieb das folgende Programm, das von der Farbe zu konvertieren versuchtOpenCV Java Graustufen-

Mat newImage = Imgcodecs.imread("q1.jpg"); 
    Mat image=new Mat(new Size(newImage.cols(),newImage.rows()),CvType.CV_64FC3); 
    int totalBytes = (int)(newImage.total() * newImage.elemSize()); 
    byte buffer[] = new byte[totalBytes]; 
    newImage.get(0, 0,buffer); 
    double b[]=new double [totalBytes]; 
    for(int i=0;i<totalBytes;i=i+3){ 
     { 
      double medie=(buffer[i]+buffer[i+1]+buffer[i+2])/3; 

      b[i]=medie; 
      b[i+1]=medie; 
      b[i+2]=medie; 
     } 
    } 
    image.put(0, 0, b); 



    Imgcodecs.imwrite("tu3.jpg",image); 

Die Tatsache, in Graustufen ist, dass es mir ein seltsames Bild gibt, wenn ich this.If kann ich den Code wie folgt:

public static void main(String[] args) { 

    Mat newImage = Imgcodecs.imread("q1.jpg"); 
    newImage.convertTo(newImage, CvType.CV_64FC3); 
    Mat image=new Mat(new Size(newImage.cols(),newImage.rows()),CvType.CV_64FC3); 
    int totalBytes = (int)(newImage.total() * newImage.elemSize()); 
    double buffer[] = new double[totalBytes]; 
    newImage.get(0, 0,buffer); 
    double b[]=new double [totalBytes]; 
    for(int i=0;i<totalBytes;i=i+3){ 
     { 
      double medie=(double)((buffer[i]+buffer[i+1]+buffer[i+2]))/3; 

      b[i]=medie; 
      b[i+1]=medie; 
      b[i+2]=medie; 
     } 
    } 
    image.put(0, 0, b); 

    Imgcodecs.imwrite("tu3.jpg",image); 
} 

es gibt mir einen guten. Warum passiert das? Wenn dieser Byte-Puffer in double medie kommt, wird er nicht implizit in double umgewandelt?

Antwort

2

Der Byte-Datentyp in Java ist eine vorzeichenbehaftete 8-Bit-Zweierkomplement-Ganzzahl. Es hat einen minimalen Wert von -128 und einen maximalen Wert von 127 (inklusive). Die Werte, die in Ihrem Bild größer als 127 sind, werden daher als Zweierkomplement-Integer abgerufen. Das bedeutet, dass Sie das Byte-Array nicht direkt verwenden können. Sie können jeden anderen Datentyp verwenden, dh short, int, float, double anstelle von byte, um das Ausnahmeergebnis zu erhalten .