[問題]關於camera先抓frame再處理
大家好:
最近想將 camera 抓到的 frame 經過處理再顯示於手機螢幕上, 但遇到奇怪的問題.
實做了SurfaceHolder.Callback, Runnable, 並在 startPreview 後開始讓 thread
跑 run( ), 這裡我把縮減過的 code 列在下面,其中 Long_time_find_circles(frame)
會處理很久 [約 0.5 秒], 這function主要是算出畫面的特徵點並圈起來!
可是我發現當畫面晃動很快時, 就算不出也畫不出特徵點, 而且畫面也不是每個畫面
都能顯示, 好像有 frame 遺失了?
我不是很了解 android 裡的 camera preview, 當收到 camera 資訊時, 他會不會自動把
frame 存在一個 buffer(queue) 裡面, 然後等前面的 frame 處理完再換下一個 frame?
還是其實沒有 buffer? 所以那些後來的 frame 因為前一個frame還沒處理完又沒 buffer
所以就直接被丟棄? 所以以我的寫法只有在速度慢或是畫面不動時才顯示得出來?
另外想在請問版上高手, 為什麼再 run 裡面需要 synchronized??
--------- 縮減版 code -------------------
public void run() {
mThreadRun = true;
while (mThreadRun) {
synchronized (this) {
bmp = Long_time_process(frame); // 找出特徵點並回傳 bmp 圖
}
if (bmp != null) { //顯示到螢幕上
Canvas canvas = mHolder.lockCanvas();
if (canvas != null) {
canvas.drawBitmap(bmp, (canvas.getWidth()-getFrameWidth()) / 2,
(canvas.getHeight() - getFrameHeight()) / 2, null);
mHolder.unlockCanvasAndPost(canvas);
}
}
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.169