カメラ画像保存&FTPで任意のサーバーに転送する
概要
イメージデータストリームから1枚のフレームを取得してFTPサーバーにアップロードする方法を示しています。
サンプルプログラム
Software | IC Imaging Control 3.5, Visual Studio™ 2022 |
---|---|
サンプル(C#) | save_Image_Sequence_withFTP_cs_3.5.zip |
サンプルツールの外観
private void Form1_Load(object sender, System.EventArgs e)
{
icImagingControl1.ShowDeviceSettingsDialog();
if( icImagingControl1.DeviceValid )
{
icImagingControl1.Sink = new TIS.Imaging.FrameSnapSink();
icImagingControl1.LiveStart();
}
else
{
Close();
}
}
Windows Formが立ち上がった時にデバイス選択のダイアログ(.ShowDeviceSettingsDialog)をコールして、使用するデバイスを選択します。正しいデバイスが選択されれば、.LiveStartによりライブ表示を開始します。その際にビデオストリームから任意のタイミングでフレームを取得するためのSinkタイプFrameSnapSinkクラスを定義しています。
private void btnsendFtp_Click(object sender, System.EventArgs e)
{
TIS.Imaging.FrameSnapSink snapSink = icImagingControl1.Sink as TIS.Imaging.FrameSnapSink;
TIS.Imaging.IFrameQueueBuffer frm = snapSink.SnapSingle(TimeSpan.FromSeconds(5));
string fileName = "Image " + imageNumber + ".bmp";
TIS.Imaging.FrameExtensions.SaveAsBitmap(frm, fileName);
sendFtp(fileName);
imageNumber += 1;
}
このコードは、Windowsフォームアプリケーションの「ftpでサーバーに転送する」ボタンがクリックされたときに、カメラから画像を取得してそれをファイルに保存し、そのファイルをFTPサーバーに送信する処理を行っています。
まず、icImagingControl1からFrameSnapSinkを取得し、SnapSingleメソッドを使って、5秒間待ってからカメラから1枚の画像(フレーム)を取得しています。
その後、"Image [imageNumber].bmp" という形式のファイル名を生成し、取得した画像をビットマップ形式で保存しています。imageNumberは保存する画像の番号で、処理ごとにインクリメント(+1を加算)されます。
最後に保存したファイルを、FTPを利用してサーバーに送信するための後述のsendFtpメソッドを呼び出しています。
private void sendFtp(string filename)
{
try
{
//アップロードするファイル
string upFile = filename;
//アップロード先のURI
Uri u = new Uri("ftp://localhost/" + filename);
//FtpWebRequestの作成
System.Net.FtpWebRequest ftpReq = (System.Net.FtpWebRequest)
System.Net.WebRequest.Create(u);
//ログインユーザー名とパスワードを設定
ftpReq.Credentials = new System.Net.NetworkCredential("username", "password");
//MethodにWebRequestMethods.Ftp.UploadFile("STOR")を設定
ftpReq.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
//要求の完了後に接続を閉じる
ftpReq.KeepAlive = false;
//ASCIIモードで転送する
ftpReq.UseBinary = false;
//PASVモードを無効にする
ftpReq.UsePassive = false;
//ファイルをアップロードするためのStreamを取得
System.IO.Stream reqStrm = ftpReq.GetRequestStream();
//アップロードするファイルを開く
System.IO.FileStream fs = new System.IO.FileStream(
upFile, System.IO.FileMode.Open, System.IO.FileAccess.Read);
//アップロードStreamに書き込む
byte[] buffer = new byte[1024];
while (true)
{
int readSize = fs.Read(buffer, 0, buffer.Length);
if (readSize == 0)
break;
reqStrm.Write(buffer, 0, readSize);
}
fs.Close();
reqStrm.Close();
//FtpWebResponseを取得
System.Net.FtpWebResponse ftpRes =
(System.Net.FtpWebResponse)ftpReq.GetResponse();
//FTPサーバーから送信されたステータスを表示
Console.WriteLine("{0}: {1}", ftpRes.StatusCode, ftpRes.StatusDescription);
//閉じる
ftpRes.Close();
}
catch(Exception ex) {
Console.WriteLine(ex);
}
}
このメソッドは、指定されたファイルをFTPサーバーにアップロードしています。
まず、「Uri u = new Uri("ftp://localhost/" + filename)」でFTPサーバーのURIを指定し、「System.Net.WebRequest.Create(u)」でFtpWebRequestクラスを使用してFTPのリクエストを作成します。作成したリクエストftpReqを使ってFTPサーバーへの接続に必要な情報(URI、認証情報、転送モードなど)を設定し、GetRequestStreamメソッドを使用してアップロード用のストリームを取得します。その後、ファイルをバイト単位で読み込み、FTPサーバーに書き込みます。最後にGetResponseメソッドを使用してFTPサーバーからの応答を取得し、取得したステータスコードと状況をコンソール画面に表示します。