カメラから取得した画像に関して

750 views
Skip to first unread message

HaL

unread,
Sep 14, 2011, 6:48:41 AM9/14/11
to Android-Embedded-Japan
お世話になります。
HaLです。

基礎から学ぶAndroidという本を手本に、USBカメラから画像取得をできるようにしたのですが
自作のカメラアプリ内でonPreviewFrame関数で

FileOutputStream outStream = null;
YuvImage yuvimage = new YuvImage(data,ImageFormat.NV21,320,240,null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
yuvimage.compressToJpeg(new Rect(0,0,320,240), 80, baos);
try {
outStream = new FileOutputStream("/sdcard/11.jpg");
outStream.write(baos.toByteArray());
outStream.close();
} catch (FileNotFoundException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
   } catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}

以上の処理をして取得したカメラの画像をjpegに落とした所、
赤い部分が全部青くなっていました。

YUV422からYUV420SPへの変換部分が怪しいのでは思っている(RGB変換したプレビューは正常に表示される)
のですがどなたか詳しい方、ご教示いただけないでしょうか。

以下のyuyv422_to_yuv420sp関数を使っています。
https://gitorious.org/android-enablement/framework-base/blobs/46d01908327cdf2c12e24931cde0670a0daeffcd/camera/libcameraservice/converter.cpp

HaL

unread,
Sep 15, 2011, 7:43:24 AM9/15/11
to Android-Embedded-Japan
HaLです。
yuyv422_to_yuv420sp関数の入力cr値とcb値を入れ替えると正常に表示されました。

// ptrsrccb1 = bufsrc + 1;
// ptrsrccb2 = bufsrc + (width<<1) + 1;
// ptrsrccb3 = bufsrc + (width<<1)*2 + 1;
// ptrsrccb4 = bufsrc + (width<<1)*3 + 1;

// ptrsrccr1 = bufsrc + 3;
// ptrsrccr2 = bufsrc + (width<<1) + 3;
// ptrsrccr3 = bufsrc + (width<<1)*2 + 3;
// ptrsrccr4 = bufsrc + (width<<1)*3 + 3;

ptrsrccr1 = bufsrc + 1;
ptrsrccr2 = bufsrc + (width<<1) + 1;
ptrsrccr3 = bufsrc + (width<<1)*2 + 1;
ptrsrccr4 = bufsrc + (width<<1)*3 + 1;

ptrsrccb1 = bufsrc + 3;
ptrsrccb2 = bufsrc + (width<<1) + 3;
ptrsrccb3 = bufsrc + (width<<1)*2 + 3;
ptrsrccb4 = bufsrc + (width<<1)*3 + 3;

ただ、関数としては元々問題ないような作りをしていると思うのですが
機器依存なのでしょうか・・・
> 以下のyuyv422_to_yuv420sp関数を使っています。https://gitorious.org/android-enablement/framework-base/blobs/46d0190...

HaL

unread,
Sep 29, 2011, 6:32:18 AM9/29/11
to Android-Embedded-Japan
HaLです。
もう一点疑問がありましたので続けて書込みます。

自作アプリで
setPreviewCallbackのonPreviewFrameを使用して
画像を取得しているのですが
Android側でこのコールバック関数を呼ぶ場所がどこなのかわかりません。
CameraService.cpp内だろうとは思っているのですが・・・
どなたかご存じの方、ご教示いただけませんか。

ueno...@gmail.com

unread,
Sep 29, 2011, 11:45:26 AM9/29/11
to android-emb...@googlegroups.com
こんばんは。

> setPreviewCallbackのonPreviewFrameを使用して
> 画像を取得しているのですが
> Android側でこのコールバック関数を呼ぶ場所がどこなのかわかりません。

試してはいないのですが、CameraHardware.cpp ではないでしょうか。
(2.3.4_r1.0 を見ています。)

frameworks/base/services/camera/libcameraservice/CameraHardware.cpp

ここの CameraHardware::previewThread() に、
mDataCb(CAMERA_MSG_PREVIEW_FRAME, buffer, mCallbackCookie);
という箇所がありました。

ただ、libcameraservice は各自で組み込むことになる部分だったと思います。


はずれてたらすみません。

--
// ueno

HaL

unread,
Oct 12, 2011, 6:58:25 AM10/12/11
to Android-Embedded-Japan
HaLです。
返事が遅くなってしまいました。

確かにそこにmDataCB関数があるのは確認しました。
ただ、そこから呼ぶのがPreviewの表示関係の処理だった思います。
こちらの実装上の問題でしょうか・・・
Reply all
Reply to author
Forward
0 new messages