Android 關於獲取攝像頭幀資料

2021-06-18 04:55:54 字數 2810 閱讀 5520

第一部分:

由於android下攝像頭預覽資料只能  imageformat.

nv21 格式的,所以解碼時要經過一翻周折.

camera mcamera = camera.open();

camera.parameters p = mcamera.getparameters();

p.setpreviewformat(imageformat.nv21);

/*這是唯一值,也可以不設定。有些同學可能設定成 pixelformat 下面的乙個值,其實是不對的,具體的可以看官方文件*/

mcamera.setparameters(p);
mcamera.startpreview();

下面是解碼核心部分:

@override

public void onpreviewframe(byte data, camera camera)

}catch(exception ex)

}

**很簡單。就是把yuv資料轉成 bitmap 就行了,系統提供 yuvimage 類。

第二部分:

拆分成位圖,然後對位圖進行處理和識別

當然,手機必須得有攝像頭

然後嘛,第一步是在androidmanifest.xml加入如下許可權宣告

<

permission

android

:name="android.permission.camera"

>

permission

>

<

uses-permission

android

:name="android.permission.camera"

/>

<

uses-feature

android

:name="android.hardware.camera"

/>

<

uses-feature

android

:name="android.hardware.camera.autofocus"

/>

攝像頭的預覽和捕獲只能通過su***ceview..

而且他的工作模式必須是su***ceholder.su***ce_type_push_buffers

不然不能在su***ceview裡面顯示出預覽的影象

然後在su***cecreated方法裡面加入我們的攝像頭初始化

public

void su***cecreated(su***ceholder arg0) catch (exception e)

}

然後看看我們的viewcallback類

在這個類裡面要實現previewcallback

主要是裡面的 public void onpreviewframe(byte data, camera arg1) {}

data就是返回的資料流了, 不過麻煩的是這個流並不是rgb編碼的,是yuv420sp編碼的,

camera.parameters 裡面有個setpreviewformat()  這個雖然可以設定 但是具體能不能編碼成jpeg是受你的手機影響的

老老實實得解碼吧...網上關於yuv420sp編碼的內容相當相當少..

static

public

void decodeyuv420sp(byte rgbbuf, byte yuv420sp, int width, int height)

y1192 = 1192 * y;

r = (y1192 + 1634 * v);

g = (y1192 - 833 * v - 400 * u);

b = (y1192 + 2066 * u);

if (r < 0) r = 0; else

if (r > 262143) r = 262143;

if (g < 0) g = 0; else

if (g > 262143) g = 262143;

if (b < 0) b = 0; else

if (b > 262143) b = 262143;

rgbbuf[yp * 3] = (byte)(r >> 10);

rgbbuf[yp * 3 + 1] = (byte)(g >> 10);

rgbbuf[yp * 3 + 2] = (byte)(b >> 10);}}

}

具體怎麼實現的我就不是很清楚了..好像是灰度在前面 然後把藍色和青色混合成乙個變數跟在後面..

但是呢.這個方法效率很低..特別是些cpu差的機器

可以數數..每次都是橫向*縱向 演算法複雜度挺高的..

然後我把他壓縮了10倍..就是每隔10個點取一次,效率瞬間就上來了.

現在執行你的程式, 你可能會發現攝像頭的樣子很奇怪。

其實是因為螢幕方向的問題

把你的螢幕設定為永久橫向即可

this.setrequestedorientation(activityinfo.screen_orientation_landscape);

//覆蓋螢幕 不顯示通知欄

this.requestwindowfeature(window.feature_no_title);

getwindow().setflags(windowmanager.layoutparams.type_status_bar, windowmanager.layoutpar

Android 呼叫攝像頭

androidmanifest新增許可權 intent呼叫開啟照相機 intent intent new intent mediastore.action image capture file file new file environment.getexternalstoragedirectory...

Opencv Python 顯示攝像頭的幀

import cv2 cameracapture cv2.videocapture 0 獲取滑鼠指令 clicked false def onmouse event,x,y,flags,param global clicked if event cv2.event lbuttonup 滑鼠左鍵鬆開 ...

Android開發之攝像頭

通過以下函式來獲得手機支援的picture和preview的大小 選擇合適的預覽尺寸 listsizelist parameters.getsupportedpreviewsizes 如果sizelist只有乙個我們也沒有必要做什麼了,因為就他乙個別無選擇 if sizelist.size 1 i9...