Robofun 機器人論壇

標題: 有關於像素處理的問題 [打印本頁]

作者: lucy5222    時間: 2018-5-3 14:37
標題: 有關於像素處理的問題
大家好
請問各位這是一個AMG8833的熱影像 他讀出來的值為溫度而我把他轉為矩陣的形式
如何把矩陣中的每個數做運算(將8*8的矩陣轉為3*3再來做運算)相關的程式如下
而這是我的問題(溫度梯度)

#include <Wire.h>
#include <Adafruit_AMG88xx.h>

Adafruit_AMG88xx amg;

float pixels[AMG88xx_PIXEL_ARRAY_SIZE];

void setup() {
    Serial.begin(9600);
    Serial.println(F("AMG88xx pixels"));

    bool status;
   
    // default settings
    status = amg.begin();
    if (!status) {
        Serial.println("Could not find a valid AMG88xx sensor, check wiring!");
        while (1);
    }
   
    Serial.println("-- Pixels Test --");

    Serial.println();

    delay(100); // let sensor boot up
}


void loop() {
    //read all the pixels
    amg.readPixels(pixels);

    Serial.print("[");
    for(int i=1; i<=AMG88xx_PIXEL_ARRAY_SIZE; i++){
      Serial.print(pixels[i-1]);
      Serial.print(", ");
      if( i%8 == 0 ) Serial.println();
    }
    Serial.println("]");
    Serial.println();

    //delay a second
    delay(1000);
}

IMAG1965.jpg (1.49 MB, 下載次數: 601)

示意圖

示意圖

作者: 超新手    時間: 2018-5-3 15:22
float B[3][3];
void EtoT(int m, int n) {
  for (int i = 0 ; i < 3 ; i++) {
    int x = m + i;
    if (x > 7) x = 7;
    else if (x < 0) x = 0;
    for (int j = 0 ; j < 3 ; j++) {
      int y = n + j;
      if (y > 7) y = 7;
      else if (y < 0) y = 0;
      B[i][j] = pixels[x * 8 + y];
    }
  }
}
呼叫 EtoT,
使用 m, n 去指定是要那一個 3x3 陣列
結果會放在 B 陣列中
例如 EtoT(0, 0) 或 EtoT(7, 7) 或 EtoT(0,7)
或是 EtoT(-1, -1)


作者: lucy5222    時間: 2018-5-7 10:19
不好意思 可以請你說明再清楚一點嗎 謝謝 三個疑問
作者: 超新手    時間: 2018-5-7 10:31
你的三個問題在那?
其實你只要直接把程式COPY到你的程式中
呼叫後
然後把值印出來就可以了

作者: lucy5222    時間: 2018-5-7 10:35
本帖最後由 lucy5222 於 2018-5-7 10:39 編輯

在這邊 謝謝你

15256604801331059500013400423928.jpg (42.19 KB, 下載次數: 615)

15256604801331059500013400423928.jpg

IMAG1987.jpg (1.83 MB, 下載次數: 637)

IMAG1987.jpg

作者: lucy5222    時間: 2018-5-7 10:37
在這邊

IMAG1986.jpg (42.19 KB, 下載次數: 506)

IMAG1986.jpg

作者: 超新手    時間: 2018-5-7 11:05
本帖最後由 超新手 於 2018-5-7 11:06 編輯

1. 不是, 是左上角
2. 對. 我的程式己經做類似處理
    你自己印出來看看就知道了
    有問題自己小改一下即可
3.  矩陣運算? 這題目可大可小
float A[3][3], B[3][3], C[3][3];
//加法 C = A+B
for(int i = 0 ; i < 3 ; i++) {
for(int j = 0 ; j < 3 ; j++) {
C[j] = A[j]+B[j];
}
}
//減法 C = A-B
for(int i = 0 ; i < 3 ; i++) {
for(int j = 0 ; j < 3 ; j++) {
C[j] = A[j]-B[j];
}
}
//乘法 C = A*B
for(int i = 0 ; i < 3 ; i++) {
for(int j = 0 ; j < 3 ; j++) {
  C[j] = 0;
  for(int k=0; k<3; k++) {
    C[j] += A[k]*B[k][j];
  }
}
}
要用 C 處理矩陣運算? ..........
作者: lucy5222    時間: 2018-5-7 11:10
本帖最後由 lucy5222 於 2018-5-7 11:13 編輯

不是矩陣之間的運算 是矩陣內的元素運算 再把他prinln出來
可以不要是左上角嗎 而是矩陣的中心
謝謝你
作者: 超新手    時間: 2018-5-7 11:18
矩陣的九個值你都知道
B[0][0], B[0][1], B[0][2],  
B[1][0], B[1][1], B[1][2],
B[2][0], B[2][1], B[2][2],
那隨便抓任何一個值出來算, 不就好了
例如
float X = B[0][0]*B[0][1] + 3*B[2][2] - B[0][2];
作者: 超新手    時間: 2018-5-7 11:25
>>可以不要是左上角嗎 而是矩陣的中心
改這個應該不會很難吧?
如果你不會改
只要呼叫前, 把 m, n 減一即可

作者: lucy5222    時間: 2018-5-7 11:33
本帖最後由 lucy5222 於 2018-5-7 15:14 編輯

好 非常謝謝你 那可以再請問如何把你打的程式加入原本的程式中在呼叫出來嗎 而且從B[0][0]到B[7][7]總共有64個矩陣能夠自動記錄 並且自動把矩陣內的運算完成  比如B[5][5](64個3*3矩陣中隨意一個的中心) 就可以自動把周遭的數字差顯示出來 (總共有8個)




















作者: 超新手    時間: 2018-5-7 16:05
本帖最後由 超新手 於 2018-5-7 16:09 編輯

看來你對陣列處理有點困難
原因出在它的輸出是一維陣列, 並不是二維陣列
所以我把程式改一下, 讓它變成二維陣列
照理說, 值輸出應該是相同的, 有問題再告知
  1. #include <Wire.h>
  2. #include <Adafruit_AMG88xx.h>
  3. Adafruit_AMG88xx amg;
  4. float pixels[8][8];
  5. void setup() {
  6.   Serial.begin(9600);
  7.   Serial.println(F("AMG88xx pixels"));
  8.   bool status;
  9.   // default settings
  10.   status = amg.begin();
  11.   if (!status) {
  12.     Serial.println("Could not find a valid AMG88xx sensor, check wiring!");
  13.     while (1);
  14.   }
  15.   Serial.println("-- Pixels Test --");
  16.   Serial.println();
  17.   delay(100); // let sensor boot up
  18. }
  19. void loop() {
  20.   //read all the pixels
  21.   amg.readPixels(&pixels[0][0]);
  22.   Serial.print("[");
  23.   for (int i = 0; i < 8; i++) {
  24.     for (int j = 0; j < 8; j++) {
  25.       Serial.print(pixels[i][j]);
  26.       Serial.print(", ");
  27.     }
  28.     Serial.println();
  29.   }
  30.   Serial.println("]");
  31.   Serial.println();
  32. // 和中心點pixels[5][5]的差值  
  33.   Serial.print(pixels[4][4] - pixels[5][5]);Serial.print(" ");
  34.   Serial.print(pixels[4][5] - pixels[5][5]);Serial.print(" ");
  35.   Serial.println(pixels[4][6] - pixels[5][5]);
  36.   Serial.print(pixels[5][4] - pixels[5][5]);Serial.print(" ");
  37.   Serial.print(pixels[5][5] - pixels[5][5]);Serial.print(" ");
  38.   Serial.println(pixels[5][6] - pixels[5][5]);
  39.   Serial.print(pixels[6][4] - pixels[5][5]);Serial.print(" ");
  40.   Serial.print(pixels[6][5] - pixels[5][5]);Serial.print(" ");
  41.   Serial.println(pixels[6][6] - pixels[5][5]);  

  42.   //delay a second
  43.   delay(1000);
  44. }
複製代碼


經過修改後, 如果你要處理 pixels[5][5] 的值
3x3 的陣列就是
pixels[4][4], pixels[4][5], pixels[4][6],
pixels[5][4], pixels[5][5], pixels[5][6],
pixels[6][4], pixels[6][5], pixels[6][6],
看你要怎樣運算都可以, 也比較直覺





作者: lucy5222    時間: 2018-5-7 16:57
本帖最後由 lucy5222 於 2018-5-7 16:59 編輯
超新手 發表於 2018-5-7 16:05
看來你對陣列處理有點困難
原因出在它的輸出是一維陣列, 並不是二維陣列
所以我把程式改一下, 讓它變成二維 ...


謝謝你用心回答我的問題 這樣子的想法我之前也有想過 只是不知道如何打
然而現在想的是如何能夠紀錄這64個矩陣(每一個中央數值與周邊數值的矩陣3*3)(因為CCD是8*8所以有64個值),在矩陣內中央數值與其他八個的差值(正的),能夠自動的紀錄,而非
需要每次輸入指定的位置才能紀錄 謝謝
作者: 超新手    時間: 2018-5-7 16:59
本帖最後由 超新手 於 2018-5-7 17:01 編輯

只要寫成副程式, 加上使
用迴圈就可以了

作者: lucy5222    時間: 2018-5-7 17:05
超新手 發表於 2018-5-7 16:59
只要寫成副程式, 加上使
用迴圈就可以了

可以請問要怎麼寫嗎 不好意思 對於這方面沒有很熟
作者: lucy5222    時間: 2018-5-8 14:35
由於沒有很熟悉副程式的應用 因此也不知道該如何著手
還請大家幫忙一下 謝謝




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2