質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

3962閲覧

Xamarin.iOSにて、AVFoundationで取得した画像を表示したい。

kamingout

総合スコア44

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2017/01/19 12:38

以下のようなCameraViewクラスを作成し、sessionから画像を取得するプログラムを作成しました。
sessionから取得した画像をCameraViewクラスのメンバ変数 UIImage imageに格納し、ViewControllerクラス内のUIImageViewにimageを貼り付けることで動的にUIImageViewにカメラの画像を表示させようとしています。
sessionの処理が行われる度にViewControllerの描画の更新を行うにはどのような処理にする必要があるでしょうか?

ご存知の方がいらっしゃいましたら御回答をお願いいたします。

public CameraView{
bool SetupCaptureSession()
{
// configure the capture session for low resolution, change this if your code
// can cope with more data or volume
session = new AVCaptureSession
{
SessionPreset = AVCaptureSession.PresetMedium
};

// ここで使用するデバイスの設定をしている // create a device input and attach it to the session var captureDevice = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Video); if (captureDevice == null) { Console.WriteLine("No captureDevice - this won't work on the simulator, try a physical device"); return false; } // ここでカメラの設定を変更をかけるためにロックをかけている //Configure for 15 FPS. Note use of LockForConigfuration()/UnlockForConfiguration() NSError error = null; captureDevice.LockForConfiguration(out error); if (error != null) { Console.WriteLine(error); captureDevice.UnlockForConfiguration(); return false; } if (UIDevice.CurrentDevice.CheckSystemVersion(7, 0)) captureDevice.ActiveVideoMinFrameDuration = new CMTime(1, 15); // ここで設定変更終了し、ロックを解除している captureDevice.UnlockForConfiguration(); var input = AVCaptureDeviceInput.FromDevice(captureDevice); if (input == null) { Console.WriteLine("No input - this won't work on the simulator, try a physical device"); return false; } session.AddInput(input); // create a VideoDataOutput and add it to the sesion var settings = new CVPixelBufferAttributes { PixelFormatType = CVPixelFormatType.CV32BGRA }; using (var output = new AVCaptureVideoDataOutput { WeakVideoSettings = settings.Dictionary }) { queue = new DispatchQueue("myQueue"); outputRecorder = new OutputRecorder(); // サブスレッド用のシリアルキューを用意し、そこでフレームの取得を行う output.SetSampleBufferDelegate(outputRecorder, queue); session.AddOutput(output); } session.StartRunning(); // セッションが動きだし、実際にデータを取得する return true; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kamu

2017/01/19 13:13

OutputRecorder内で画像を取得しているところまではできていて、その画像の表示の仕方が分からないということですかね?
kamingout

2017/01/19 13:21

その通りです。取得した画像をViewControllerでの表示を取得するたびに更新したいのですが、良い方法はありますでしょうか?
guest

回答1

0

ベストアンサー

ViewControllerとCameraVIewとでUIImageViewをやりとりできるようにCameraView側にUIImageViewのプロパティをおいてそれ経由で更新するのはどうでしょうか?
こういうことではなかったらすみません。

cs

1public class CameraView 2{ 3 //ViewControllerとやりとりするプロパティを作る 4 public UIImageView ImageView { get; set; } 5 6 //略 7 public void Hoge() { 8 //それをOutputRecorderに渡す 9 outputRecorder = new OutputRecorder(ImageView); 10 } 11} 12 13public class OutputRecorder : AVCaptureVideoDataOutputSampleBufferDelegate 14{ 15 private UIImageView _imageView; 16 17 public OutputRecorder(UIImageView imageView) { 18 _imageView = imageView; 19 } 20 21 public override void DidOutputSampleBuffer( 22 AVCaptureOutput captureOutput, 23 CMSampleBuffer sampleBuffer, 24 AVCaptureConnection connection) { 25 26 //BufferからUIImageを取得する処理 27 var image = GetImageFromSampleBuffer(sampleBuffer); 28 29 //Device.BeginInvokeOnMainThread(() => { 30 InvokeOnMainThread(() =>{ 31 //画像を取得する度に画像更新 32 _imageView.Image = image; 33 }); 34 } 35}

投稿2017/01/19 13:48

編集2017/01/19 14:30
kamu

総合スコア208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kamingout

2017/01/19 14:01

詳細なご説明ありがとうございます。 大変わかりやすいです。 CameraViewクラスと、ViewControllerクラスは異なるのですが、手順としては ViewControllerのUIImageViewをCameraViewに送り、そのUIImageViewをOutputRecorderに送り、 OutputRecorder内で送られてきたUIImageViewに対して取得した画像を貼り付けるという流れでよろしいでしょうか? あと、この関数はどのような役割を果たしているのでしょうか? Device.BeginInvokeOnMainThread(() => 単純に、このような記述だけではだめですか? _imageView.Image = image; お手数おかけしますが、ご返信よろしくお願いいたします。
kamu

2017/01/19 14:31 編集

1つめは全くその通りです。 2つめなんですが、DidOutputSampleBufferはMainスレッドではないと思うので多分そのままだと怒られます。UIをいじるときはMainスレッドじゃないとダメみたいなのでDevice.BeginInvokeOnMainThreadでMainスレッドで実行してもらうようにしています。 が…DeviceはXamarin.Formsの書き方でした。多分iOSでは以下の感じでいけるかと。 ```cs InvokeOnMainThread(() => { _imageView.Image = image; }); ``` 回答の方も編集しました。
kamingout

2017/01/19 14:55

複数の質問への御回答ありがとうございます。 大変わかりやすかったです。 今、実行できる環境にいないのでまた明日試してみたいと思います。 ベストアンサーとさせていただきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問