أول مرة هنا ؟ تفحص قواعد المشاركة و معلومات أخرى عن عرب overflow!
x

كيف أقوم بتشكيل صورة من مجموعة من الـ pixels بأستخدام لغة الجافا؟

+2 صوت
207 مشاهدات

TTL camera
قمت بتوصيل الكاميرا TTL الي بوردة أردوينو أنو (Arduino Uno board)
و عند إلتقاط صورة بها يكون خرجها كالتالي :

TTL Camera dataset

قممد ببناء هذه الدالة بعد البحث لفترة على الأنترنت:

public BufferedImage setRGB(BufferedImage bufferedImage, int w, int h, int[] rgbArray, int offset, int scansize) {
    ColorModel colorModel = bufferedImage.getColorModel();
    WritableRaster raster = bufferedImage.getRaster();
    int yoff = offset;
    int off;
    Object pixel = null;

    for (int y = 0; y < h; y++, yoff += scansize) {
        off = yoff;
        for (int x = 0; x < w; x++) {
            if (y == rgbArray.length - 3) {
                break;
            }
            pixel = colorModel.getDataElements(rgbArray[off++], pixel);
            raster.setDataElements(x, y, pixel);
        }
    }
    return bufferedImage;
}

ولكن الناتج لا يكون كما يجب فالناتج يكون عبارة عن صورة مشوهة
لكن عند أستخدام هذه الدالة مع صورة عادية فإنها تقوم ببنائها كالأصل تماما

معلومات أكثر عن نوع البيانات الخارجة من الكاميرا ؟
هل مثلا يخرج R + G +B معمول لهم encoding ?
البيانات الخارجة من الكاميرا كلها موجودة في الرابط الي فوق في السؤال

https://www.dropbox.com/s/pmig86u7j6qur07/ttl%20camera%20dataset.txt?dl=0

إجابة واحدة

0 صوت

 
أفضل إجابة

مبدأيا يمكنك استخدام هذا الكود على الأردوينو :-

#include <SoftwareSerial.h> 

byte incomingbyte;

//Configure pin 2 and 3 as soft serial port
SoftwareSerial cameraSerial = SoftwareSerial(2, 3); 

int a=0x0000,  //Read Starting address     
    j=0,
    k=0,
    count=0;
uint8_t MH,ML;
boolean EndFlag=0;


void setup() { 
  Serial.begin(19200);
  cameraSerial.begin(38400);

  SendResetCmd();
  delay(3000);
}

void loop() {
  SendTakePhotoCmd();

  Serial.println("Start pic"); 
  delay(100);

  while(cameraSerial.available()>0) {
    incomingbyte=cameraSerial.read();
  }
  byte b[32];

  while(!EndFlag) {  
    j=0;
    k=0;
    count=0;
    SendReadDataCmd();

    delay(75); //try going up
    while(cameraSerial.available()>0) {
      incomingbyte=cameraSerial.read();
      k++;
      if((k>5)&&(j<32)&&(!EndFlag)) {
        b[j]=incomingbyte;
        if((b[j-1]==0xFF)&&(b[j]==0xD9))
        EndFlag=1;                           
        j++;
        count++;
      }
    }

    for(j=0;j<count;j++) {   
      if(b[j]<0x10)
        Serial.print("0");
      Serial.print(b[j], HEX);
    }
    Serial.println();
  }

  delay(3000);
  StopTakePhotoCmd(); //stop this picture so another one can be taken
  EndFlag = 0; //reset flag to allow another picture to be read
  Serial.println("End of pic");
  Serial.println(); 
}

//Send Reset command
void SendResetCmd() {
  cameraSerial.write((byte)0x56);
  cameraSerial.write((byte)0x00);
  cameraSerial.write((byte)0x26);
  cameraSerial.write((byte)0x00);   
}

//Send take picture command
void SendTakePhotoCmd() {
  cameraSerial.write((byte)0x56);
  cameraSerial.write((byte)0x00);
  cameraSerial.write((byte)0x36);
  cameraSerial.write((byte)0x01);
  cameraSerial.write((byte)0x00);

  a = 0x0000; //reset so that another picture can taken
}

void FrameSize() {
  cameraSerial.write((byte)0x56);
  cameraSerial.write((byte)0x00);
  cameraSerial.write((byte)0x34);
  cameraSerial.write((byte)0x01);
  cameraSerial.write((byte)0x00);  
}

//Read data
void SendReadDataCmd() {
  MH=a/0x100;
  ML=a%0x100;

  cameraSerial.write((byte)0x56);
  cameraSerial.write((byte)0x00);
  cameraSerial.write((byte)0x32);
  cameraSerial.write((byte)0x0c);
  cameraSerial.write((byte)0x00);
  cameraSerial.write((byte)0x0a);
  cameraSerial.write((byte)0x00);
  cameraSerial.write((byte)0x00);
  cameraSerial.write((byte)MH);
  cameraSerial.write((byte)ML);
  cameraSerial.write((byte)0x00);
  cameraSerial.write((byte)0x00);
  cameraSerial.write((byte)0x00);
  cameraSerial.write((byte)0x20);
  cameraSerial.write((byte)0x00);
  cameraSerial.write((byte)0x0a);

  a+=0x20; 
}

void StopTakePhotoCmd() {
  cameraSerial.write((byte)0x56);
  cameraSerial.write((byte)0x00);
  cameraSerial.write((byte)0x36);
  cameraSerial.write((byte)0x01);
  cameraSerial.write((byte)0x03);        

}

ثم تشغيل برنامج باستخدام ال Python
لتحويل الخرج الى صورة :-

import binascii

f = open ("outputData5.txt","r")
nf = open("binaryData5.jpg","wb")

#Read whole file into data
while 1:
    c = f.readline()
    d = c.strip()
    if not c:
        break
    nf.write(binascii.a2b_hex(d))


# Close the file
f.close()
nf.close()

Python 2.7 code

يمكنك أن تعمل على تحويل كود البايثون الى كود جافا

--
يمكنك أن تجعل كود بايثون يعمل على الجافا باستخدام مكتبة جايثون Jython

http://www.jython.org/

طيب ليه الكاميرا بتعمل الصورة في وقت كبير حوالي 30 ثانية ؟
قرأت على موقع AdaFruit أن الكاميرا بطئية فعلا و هى تقوم بعمل 3 صور تقريبا فى الدقيقة وأنها غير مناسبة ل real time analysis .
هل يمكنك أن توفر لي لينك الموضوع الخاص بالكاميرا من موقع  AdaFruit
 و أن تقوم بترشيح بعض أنواع الكاميرات المناسبة لأغراض الـ Real time
ولك جزيل الشكر
Araboverflow أهلا بكم فى عرب Overflow
المجتمع العربى للأسئلة و الأجوبة التقنية.

أحدث الشارات

100 نقطة
- محمد أحمد -
سؤال ملحوظ
- h98 -
سؤال ذائع الصيت
- Zaid -
سيرة ذاتية
- 0xzidane -
100 نقطة
- 0xzidane -
...