有關於像素處理的問題
大家好請問各位這是一個AMG8833的熱影像 他讀出來的值為溫度而我把他轉為矩陣的形式
如何把矩陣中的每個數做運算(將8*8的矩陣轉為3*3再來做運算)相關的程式如下
而這是我的問題(溫度梯度)
#include <Wire.h>
#include <Adafruit_AMG88xx.h>
Adafruit_AMG88xx amg;
float pixels;
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);
Serial.print(", ");
if( i%8 == 0 ) Serial.println();
}
Serial.println("]");
Serial.println();
//delay a second
delay(1000);
}
float B;
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 = pixels;
}
}
}
呼叫 EtoT,
使用 m, n 去指定是要那一個 3x3 陣列
結果會放在 B 陣列中
例如 EtoT(0, 0) 或 EtoT(7, 7) 或 EtoT(0,7)
或是 EtoT(-1, -1)
不好意思 可以請你說明再清楚一點嗎 謝謝 三個疑問 你的三個問題在那?
其實你只要直接把程式COPY到你的程式中
呼叫後
然後把值印出來就可以了
本帖最後由 lucy5222 於 2018-5-7 10:39 編輯
在這邊 謝謝你 在這邊 本帖最後由 超新手 於 2018-5-7 11:06 編輯
1. 不是, 是左上角
2. 對. 我的程式己經做類似處理
你自己印出來看看就知道了
有問題自己小改一下即可
3.矩陣運算? 這題目可大可小
float A, B, C;
//加法 C = A+B
for(int i = 0 ; i < 3 ; i++) {
for(int j = 0 ; j < 3 ; j++) {
C = A+B;
}
}
//減法 C = A-B
for(int i = 0 ; i < 3 ; i++) {
for(int j = 0 ; j < 3 ; j++) {
C = A-B;
}
}
//乘法 C = A*B
for(int i = 0 ; i < 3 ; i++) {
for(int j = 0 ; j < 3 ; j++) {
C = 0;
for(int k=0; k<3; k++) {
C += A*B;
}
}
}
要用 C 處理矩陣運算? ..........:L 本帖最後由 lucy5222 於 2018-5-7 11:13 編輯
不是矩陣之間的運算 是矩陣內的元素運算 再把他prinln出來
可以不要是左上角嗎 而是矩陣的中心
謝謝你 矩陣的九個值你都知道
B, B, B,
B, B, B,
B, B, B,
那隨便抓任何一個值出來算, 不就好了
例如
float X = B*B + 3*B - B; >>可以不要是左上角嗎 而是矩陣的中心
改這個應該不會很難吧?
如果你不會改
只要呼叫前, 把 m, n 減一即可
本帖最後由 lucy5222 於 2018-5-7 15:14 編輯
好 非常謝謝你 那可以再請問如何把你打的程式加入原本的程式中在呼叫出來嗎 而且從B到B總共有64個矩陣能夠自動記錄 並且自動把矩陣內的運算完成比如B(64個3*3矩陣中隨意一個的中心) 就可以自動把周遭的數字差顯示出來 (總共有8個)
本帖最後由 超新手 於 2018-5-7 16:09 編輯
看來你對陣列處理有點困難
原因出在它的輸出是一維陣列, 並不是二維陣列
所以我把程式改一下, 讓它變成二維陣列
照理說, 值輸出應該是相同的, 有問題再告知
#include <Wire.h>
#include <Adafruit_AMG88xx.h>
Adafruit_AMG88xx amg;
float pixels;
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 = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
Serial.print(pixels);
Serial.print(", ");
}
Serial.println();
}
Serial.println("]");
Serial.println();
// 和中心點pixels的差值
Serial.print(pixels - pixels);Serial.print(" ");
Serial.print(pixels - pixels);Serial.print(" ");
Serial.println(pixels - pixels);
Serial.print(pixels - pixels);Serial.print(" ");
Serial.print(pixels - pixels);Serial.print(" ");
Serial.println(pixels - pixels);
Serial.print(pixels - pixels);Serial.print(" ");
Serial.print(pixels - pixels);Serial.print(" ");
Serial.println(pixels - pixels);
//delay a second
delay(1000);
}
經過修改後, 如果你要處理 pixels 的值
3x3 的陣列就是
pixels, pixels, pixels,
pixels, pixels, pixels,
pixels, pixels, pixels,
看你要怎樣運算都可以, 也比較直覺
本帖最後由 lucy5222 於 2018-5-7 16:59 編輯
超新手 發表於 2018-5-7 16:05
看來你對陣列處理有點困難
原因出在它的輸出是一維陣列, 並不是二維陣列
所以我把程式改一下, 讓它變成二維 ...
謝謝你用心回答我的問題 這樣子的想法我之前也有想過 只是不知道如何打
然而現在想的是如何能夠紀錄這64個矩陣(每一個中央數值與周邊數值的矩陣3*3)(因為CCD是8*8所以有64個值),在矩陣內中央數值與其他八個的差值(正的),能夠自動的紀錄,而非
需要每次輸入指定的位置才能紀錄 謝謝 本帖最後由 超新手 於 2018-5-7 17:01 編輯
只要寫成副程式, 加上使
用迴圈就可以了
超新手 發表於 2018-5-7 16:59
只要寫成副程式, 加上使
用迴圈就可以了
可以請問要怎麼寫嗎 不好意思 對於這方面沒有很熟 由於沒有很熟悉副程式的應用 因此也不知道該如何著手
還請大家幫忙一下 謝謝
頁:
[1]