<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>橋本商会 &#187; DLL</title>
	<atom:link href="http://shokai.org/blog/archives/tag/dll/feed" rel="self" type="application/rss+xml" />
	<link>http://shokai.org/blog</link>
	<description>なんか作ったりした記録を忘れないうちに書くblog</description>
	<lastBuildDate>Sun, 20 May 2012 10:50:20 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com/" />
			<item>
		<title>C++/CLIで動かしているOpenCVのCvImageをC#.NETのBitmapオブジェクトにして読み込む</title>
		<link>http://shokai.org/blog/archives/4499</link>
		<comments>http://shokai.org/blog/archives/4499#comments</comments>
		<pubDate>Fri, 24 Apr 2009 20:45:36 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[DLL]]></category>
		<category><![CDATA[OpenCV]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=4499</guid>
		<description><![CDATA[橋本商会: Cで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC# Formアプリから使う の続き。 FormアプリからOpenCVのHighGUIを別ウィンドウで開いていたが、Bitmapオブジェク [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://shokai.org/blog/archives/4477">橋本商会: Cで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC# Formアプリから使う</a> の続き。<br />
FormアプリからOpenCVのHighGUIを別ウィンドウで開いていたが、Bitmapオブジェクトにキャストする事で.NETアプリのPictureBoxなどに読み込む事が出来る。<br />
これにより画像処理だけ高速にC++で行い、アプリケーションのUIやネットワーク部分はC#.NETで実装するといういいとこどりが出来る。<br />
<br />
<br />
■出来た物<br />
FormにLoadImageボタンとPictureBoxを追加。<br />
LoadButtonを押すとShadowCamera.dllから呼び出しているOpenCV側のCvImageが変換されてBitmapになって出てくる関数を作った。<br />
<a href="http://www.flickr.com/photos/shokai/3470686133/" title="C++/OpenCVのCvImageを.NETのBitmapに変換できた by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3609/3470686133_47f62356e6.jpg" width="500" height="337" alt="C++/OpenCVのCvImageを.NETのBitmapに変換できた" /></a><br />
<br />
今回作っているShadowCameraは背景を蓄積させて統計を取り、差分で人物の影だけを抜き出すライブラリなので、毎フレーム計算し続ける必要がある。runCapture()の最後でwhileループさせて実現している。<br />
なので、1つBitmapオブジェクトを用意しておき、whileループの最後で処理結果を毎回保存しておいてそれをC#側から適当なタイミングで読みに行く実装にした。<br />
DLLであるC++/OpenCV側のループを毎フレーム回し続けながら、それをブロックする事なくC# Formアプリ側から取得できる。<br />
<br />
<br />
例によって<a href="http://shokai.org/projects/opencv-study/">OpenCV勉強用mercurialリポジトリ</a>の<a href="http://shokai.org/projects/opencv-study/index.cgi/rev/c9320e90f1be">changes19としてcommit</a>してある。<br />
<br />
<br />
なお、VisualStudioはC#はutf8なのにC++はshift_jisで保存されてしまい、utf8にするとビルドできなくなってしまうのでリポジトリビューアでは文字化けしてしまっている。悲しい。<br />
文字化けしている部分には大したこと書いてないので無視していいし、必要ならリポジトリの左側からzipでダウンロードできる。<br />
<br />
<br />
ちなみに今回の方法は、<a href="http://shokai.org/blog/archives/829">3年以上前の開発合宿</a>の記事に匿名様が<br />
コメントで教えてくれたSharperCVのCvImage型をSystem.Drawing.Bitmap型に変換する方法が書かれていてそれを元にした。<br />
やはりできなかった事とかも書いてみるものだなと思った。もちろん助けをアテにしちゃいけないが<br />
<br />
<br />
■ShadowCamera.dll側の変更<br />
C++プロジェクトのShadowCameraに、System.Drawingへの参照を追加する。Bitmapクラスを使うため。<br />
<a href="http://www.flickr.com/photos/shokai/3471041179/" title="C++/OpenCVのCvImageを.NETのBitmapに変換できた by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3643/3471041179_3d3645598e.jpg" width="296" height="369" alt="C++/OpenCVのCvImageを.NETのBitmapに変換できた" /></a><br />
<br />
<br />
「新しい参照の追加」ボタンを押す<br />
<a href="http://www.flickr.com/photos/shokai/3471043787/" title="C++/OpenCVのCvImageを.NETのBitmapに変換できた by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3325/3471043787_974c803312_o.png" width="856" height="479" alt="C++/OpenCVのCvImageを.NETのBitmapに変換できた" /></a><br />
<br />
<br />
.NETタブの下の方にスクロールしていって、System.Drawing を追加する。<br />
<a href="http://www.flickr.com/photos/shokai/3471045215/" title="C++/OpenCVのCvImageを.NETのBitmapに変換できた by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3546/3471045215_b29fff723b_o.png" width="553" height="347" alt="C++/OpenCVのCvImageを.NETのBitmapに変換できた" /></a><br />
<br />
<br />
ShadowCamera.hにコードを書き加える<br />
<br />
<a href="http://shokai.org/projects/opencv-study/index.cgi/file/c9320e90f1be/ShadowCamera/ShadowCamera.h">OpenCV Study: c9320e90f1be ShadowCamera/ShadowCamera.h</a><br />
DLLへの参照を追加して<br />
<pre class="prettyprint">using namespace System::Drawing;</pre>
<br />
<br />
勝手に書き換えられたら嫌なので、privateでグローバル変数 shadow を作っておく<br />
<pre class="prettyprint">private:<br />
&nbsp;&nbsp;&nbsp;&nbsp;System::Drawing::Bitmap^&nbsp;shadow;</pre>
<br />
<br />
DLL利用側のためのアクセサを用意する<br />
<pre class="prettyprint">public:<br />
&nbsp;&nbsp;&nbsp;&nbsp;System::Drawing::Bitmap^&nbsp;ShadowImage(void){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this-&gt;shadow;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</pre>
これでDLL内のshadowというBitmapオブジェクトを、DLL外から読み出す事が出来るようになった。<br />
いまいち ^ や ~ などをつけるルールを把握しきれていないけど、他のC++/CLIアプリがそうやっていたので先人の作法に倣うことにする。<br />
<br />
<br />
あとはrunCapture()の最後のwhileループ内で、毎回作られるimgResultというIplImage(CvImage互換)オブジェクトをdynamic_castしてshadowに保存する。<br />
<pre class="prettyprint">this-&gt;shadow&nbsp;=&nbsp;dynamic_cast&lt;System::Drawing::Bitmap^&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;(gcnew&nbsp;System::Drawing::Bitmap(w,h,w*3,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;System::Drawing::Imaging::PixelFormat::Format24bppRgb,<br />
&nbsp;&nbsp;&nbsp;&nbsp;static_cast&lt;System::IntPtr&gt;(imgResult-&gt;imageDataOrigin)));</pre>
長いので変換部分のみ抜粋。<a href="http://shokai.org/projects/opencv-study/index.cgi/file/c9320e90f1be/ShadowCamera/ShadowCamera.h">ShadowCamera.h</a>の85～125行目がwhileループです<br />
<br />
dynamic_castやstatic_castの違いは<a href="http://www.s34.co.jp/cpptechdoc/article/newcast/">C++の新しいキャスト</a>が参考になった。<br />
オブジェクトの代入のためのcastは.NETの上で動いているからdynamic_castで、unmanaged領域と行き来するSystem::IntPtrと*char間のcastはstatic_castになるという理解でいいのかな？<br />
<br />
<br />
<br />
■ShadowCamera.dllを使うC# Formアプリ側の変更<br />
ボタン（buttonLoadImage）と画像を表示するためのPictureBox（pictureBoxResult）を配置。<br />
PictureBoxはSizeModeをStretchImageにしておくと自動リサイズされて便利。<br />
<a href="http://www.flickr.com/photos/shokai/3471068855/" title="C++/OpenCVのCvImageを.NETのBitmapに変換できた by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3301/3471068855_0530ffed82_o.png" width="460" height="515" alt="C++/OpenCVのCvImageを.NETのBitmapに変換できた" /></a><br />
<br />
<br />
で、ボタン押下イベントで<br />
<pre class="prettyprint">pictureBoxResult.Image&nbsp;=&nbsp;cam.ShadowImage();</pre>
BitmapをPictureBoxのImageプロパティに突っ込むだけで表示できる。楽ちんだ<br />
<a href="http://www.flickr.com/photos/shokai/3470686133/" title="C++/OpenCVのCvImageを.NETのBitmapに変換できた by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3609/3470686133_47f62356e6.jpg" width="500" height="337" alt="C++/OpenCVのCvImageを.NETのBitmapに変換できた" /></a><br />
<br />
終わり。<br />
<br />
ボタンじゃなくてThreadなどで適当にsleepを入れながら読み込み続ければふつうに影カメラになる。<br />
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/4499/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Cで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC# Formアプリから使う</title>
		<link>http://shokai.org/blog/archives/4477</link>
		<comments>http://shokai.org/blog/archives/4477#comments</comments>
		<pubDate>Fri, 24 Apr 2009 12:11:15 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[DLL]]></category>
		<category><![CDATA[OpenCV]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[VS2008]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=4477</guid>
		<description><![CDATA[重い画像処理をC++の画像処理ライブラリであるOpenCVでやって、ネットワーク処理は慣れ親しんだC#.NETでやりたい。 そこで、色々試行錯誤した結果、C#からは「処理し終わった画像を表示してくれるカメラ」に見えるよう [...]]]></description>
			<content:encoded><![CDATA[<p>
重い画像処理をC++の画像処理ライブラリであるOpenCVでやって、ネットワーク処理は慣れ親しんだC#.NETでやりたい。<br />
そこで、色々試行錯誤した結果、C#からは「処理し終わった画像を表示してくれるカメラ」に見えるような、OpenCVの処理部分を含んだDLLをC++/CLIで作ることにした。<br />
（OpenCVそのものについてと開発環境構築は<a href="http://shokai.org/blog/archives/4141">橋本商会 ? OpenCVをはじめた</a>に書いた）<br />
<br />
<br />
他にも連動のさせかたは<a href="http://www.cs.ru.ac.za/research/groups/SharperCV/">SharperCV</a>というC#ラッパーを使うとか、<a href="http://cv.nextfoods.jp/index.php?opencv%2Fsample%2Fstreaming">SocketでOpenCVで処理した結果の画像だけ送る</a>とか色々とやり方はあるけど、<br />
前者は2003年でプロジェクトが止まっていてcvPow等の配列関連の関数が無く、後者は俺のMicrosoft SDKのWinUser.hの6373行目あたりから文字化けしていてWinSocketが使えなかったりしたのでDLLを作るやり方に落ち着いた。<br />
<br />
<br />
この方法のメリットは、まず納得のいくOpenCVの処理をC++単体のプロジェクトでいつもどおり書いて、それをほぼコピペすればDLLができてしまうところ。<br />
ShaperCVを使う場合は全て関数を照らし合わせてC#で書き直さなければならないので面倒。<br />
Socketを使う方はよく知らない。<br />
<br />
<br />
DLLの作り方はかせいさんとこが参考になった。CLIを使う場合と使わない場合が解説されている。（今回は楽する為にCLIを使う）<br />
<ul>
<li><a href="http://d.hatena.ne.jp/kasei_san/20070511/p1">DLLの概要と実装方法。 &#8211; かせいさんとこ</a></li>
<li><a href="http://d.hatena.ne.jp/pota_dahon/20080305">C#からC++のDLLを利用する方法 &#8211; pota_dahonの日記</a></li>
</ul>
<br />
<br />
■今回つくるもの<br />
<a href="http://shokai.org/projects/opencv-study/">mercurialリポジトリ</a>をアップロードした。左のバーからzipでダウンロードするか、<br />
</p>
<blockquote><p>hg clone http://shokai.org/projects/opencv-study/ opencv-study</p></blockquote>
<p>
してリポジトリを複製してください。<br />
<br />
<ul>
<li><a href="http://shokai.org/projects/opencv-study/index.cgi/file/7537970cfc6b/ShadowCamera">OpenCV Study: 7537970cfc6b /ShadowCamera/</a> : 影カメラライブラリ</li>
<li><a href="http://shokai.org/projects/opencv-study/index.cgi/file/7537970cfc6b/ShadowCameraSample">OpenCV Study: 7537970cfc6b /ShadowCameraSample/</a> : 影カメラライブラリを使うFormアプリケーション</li>
</ul>
の2つを作ります。<br />
影カメラライブラリの方は、<a href="http://shokai.org/projects/opencv-study/index.cgi/file/7537970cfc6b/BgSubAvg/bgsubAvg.cpp">OpenCV Study: 7537970cfc6b BgSubAvg/bgsubAvg.cpp</a>をDLL化したもので、cvRunningAvgを使って背景統計を取って背景差分して人型の影を作るもの → <a href="http://d.hatena.ne.jp/shokai/20090212/1234440251">cvRunningAvgを使って背景統計を取り背景差分する &#8211; 橋本詳解</a><br />
<br />
<br />
完成図はこれ。C#で作ったFormアプリで、ボタンを押すとDLLに書いてあるOpenCVの処理が起動してウィンドウが開き画像処理結果が表示/毎フレーム更新される。<br />
<a href="http://www.flickr.com/photos/shokai/3470022957/" title="Cで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC#から使う by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3499/3470022957_55c118a20c.jpg" width="500" height="249" alt="Cで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC#から使う" /></a><br />
<br />
<br />
<br />
■C++でDLLを作る<br />
まず空のソリューションを作る。<br />
ソリューション名を右クリックして新しいプロジェクト追加<br />
<a href="http://www.flickr.com/photos/shokai/3470811574/" title="Cで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC#から使う by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3507/3470811574_e25fa193ee.jpg" width="454" height="404" alt="Cで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC#から使う" /></a><br />
<br />
<br />
VC++のクラスライブラリを作成する。名前はShadowCameraにした<br />
<a href="http://www.flickr.com/photos/shokai/3469998341/" title="Cで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC#から使う by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3506/3469998341_e92f96d625_o.png" width="796" height="408" alt="Cで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC#から使う" /></a><br />
<br />
<br />
できたShadowCameraプロジェクトを右クリックしてプロパティを編集<br />
<a href="http://www.flickr.com/photos/shokai/3470815346/" title="Cで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC#から使う by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3035/3470815346_32fd943140.jpg" width="319" height="180" alt="Cで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC#から使う" /></a><br />
<br />
<br />
OpenCV用のライブラリを読み込む。<br />
すべての構成->入力->追加の依存ファイル に<br />
</p>
<blockquote><p>$(NoInherit) highgui.lib cxts.lib cv.lib cxcore.lib ml.lib cvaux.lib cvhaartraining.lib</p></blockquote>
<p>
を書く <br />
<a href="http://www.flickr.com/photos/shokai/3470817812/" title="Cで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC#から使う by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3595/3470817812_ea25865e46_o.png" width="856" height="479" alt="Cで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC#から使う" /></a><br />
<br />
<a href="http://shokai.org/projects/opencv-study/index.cgi/file/7537970cfc6b/ShadowCamera/ShadowCamera.h">ShadowCamera.h</a>のClass名をCameraに変更、さらにint runCapture()関数を書く。<br />
この関数の中にOpenCVのmain()を全部突っ込んでしまえばそのまま動く。今回は<a href="http://shokai.org/projects/opencv-study/index.cgi/file/7537970cfc6b/BgSubAvg/bgsubAvg.cpp">bgsubAvg.cpp</a>のmain()をコピペしたけど<a href="http://shokai.org/projects/opencv-study/index.cgi/file/7537970cfc6b/">他にも赤色重心追跡や肌色検出、単純なカメラ入力など色々作った</a>ので好きなものをコピペしてよい。<br />
OpenCV関連のヘッダを#includeで読み込むのを忘れずに。<br />
（試しにint asdf()という単に数値を返すだけの関数も作っておいた。これがC#から呼べればちゃんとDLLとして読み込めているはず）<br />
<br />
<a href="http://shokai.org/projects/opencv-study/index.cgi/file/7537970cfc6b/ShadowCamera/ShadowCamera.h">OpenCV Study: 7537970cfc6b ShadowCamera/ShadowCamera.h</a><br />
</p>
<blockquote><p>
//&nbsp;ShadowCamera.h<br />
#include&nbsp;&lt;cv.h&gt;<br />
#include&nbsp;&lt;highgui.h&gt;<br />
#include&nbsp;&lt;ctype.h&gt;<br />
#include&nbsp;&lt;stdio.h&gt;<br />
<br />
#pragma&nbsp;once<br />
<br />
using&nbsp;namespace&nbsp;System;<br />
<br />
namespace&nbsp;ShadowCamera&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ref&nbsp;class&nbsp;Camera<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO:&nbsp;このクラスの、ユーザーのメソッドをここに追加してください。<br />
&nbsp;&nbsp;&nbsp;&nbsp;public:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;asdf(void){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;15;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;runCapture(void){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;isStop&nbsp;=&nbsp;false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;int&nbsp;INIT_TIME&nbsp;=&nbsp;50;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;double&nbsp;BG_RATIO&nbsp;=&nbsp;0.02;&nbsp;//&nbsp;背景領域更新レート<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;double&nbsp;OBJ_RATIO&nbsp;=&nbsp;0.005;&nbsp;//&nbsp;物体領域更新レート<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;double&nbsp;Zeta&nbsp;=&nbsp;10.0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IplImage&nbsp;*img&nbsp;=&nbsp;NULL;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CvCapture&nbsp;*capture&nbsp;=&nbsp;NULL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;capture&nbsp;=&nbsp;cvCreateCameraCapture(0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//capture&nbsp;=&nbsp;cvCaptureFromAVI(&quot;test.avi&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(capture&nbsp;==&nbsp;NULL){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;capture&nbsp;device&nbsp;not&nbsp;found!!&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;img&nbsp;=&nbsp;cvQueryFrame(capture);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;w&nbsp;=&nbsp;img-&gt;width;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;h&nbsp;=&nbsp;img-&gt;height;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IplImage&nbsp;*imgAverage&nbsp;=&nbsp;cvCreateImage(cvSize(w,&nbsp;h),&nbsp;IPL_DEPTH_32F,&nbsp;3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IplImage&nbsp;*imgSgm&nbsp;=&nbsp;cvCreateImage(cvSize(w,&nbsp;h),&nbsp;IPL_DEPTH_32F,&nbsp;3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IplImage&nbsp;*imgTmp&nbsp;=&nbsp;cvCreateImage(cvSize(w,&nbsp;h),&nbsp;IPL_DEPTH_32F,&nbsp;3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IplImage&nbsp;*img_lower&nbsp;=&nbsp;cvCreateImage(cvSize(w,&nbsp;h),&nbsp;IPL_DEPTH_32F,&nbsp;3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IplImage&nbsp;*img_upper&nbsp;=&nbsp;cvCreateImage(cvSize(w,&nbsp;h),&nbsp;IPL_DEPTH_32F,&nbsp;3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IplImage&nbsp;*imgSilhouette&nbsp;=&nbsp;cvCreateImage(cvSize(w,&nbsp;h),&nbsp;IPL_DEPTH_8U,&nbsp;1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IplImage&nbsp;*imgSilhouetteInv&nbsp;=&nbsp;cvCreateImage(cvSize(w,&nbsp;h),&nbsp;IPL_DEPTH_8U,&nbsp;1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IplImage&nbsp;*imgResult&nbsp;=&nbsp;cvCreateImage(cvSize(w,&nbsp;h),&nbsp;IPL_DEPTH_8U,&nbsp;3);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;背景初期化中&#8230;&yen;n&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvSetZero(imgAverage);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;INIT_TIME;&nbsp;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;img&nbsp;=&nbsp;cvQueryFrame(capture);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvAcc(img,&nbsp;imgAverage);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;輝度平均&nbsp;%d/%d&yen;n&quot;,&nbsp;i,&nbsp;INIT_TIME);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvConvertScale(imgAverage,&nbsp;imgAverage,&nbsp;1.0&nbsp;/&nbsp;INIT_TIME);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvSetZero(imgSgm);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;INIT_TIME;&nbsp;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;img&nbsp;=&nbsp;cvQueryFrame(capture);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvConvert(img,&nbsp;imgTmp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvSub(imgTmp,&nbsp;imgAverage,&nbsp;imgTmp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvPow(imgTmp,&nbsp;imgTmp,&nbsp;2.0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvConvertScale(imgTmp,&nbsp;imgTmp,&nbsp;2.0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvPow(imgTmp,&nbsp;imgTmp,&nbsp;0.5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvAcc(imgTmp,&nbsp;imgSgm);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;輝度振幅&nbsp;%d/%d&yen;n&quot;,&nbsp;i,&nbsp;INIT_TIME);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvConvertScale(imgSgm,&nbsp;imgSgm,&nbsp;1.0&nbsp;/&nbsp;INIT_TIME);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;背景初期化完了&yen;n&quot;);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;winNameCapture[]&nbsp;=&nbsp;&quot;Capture&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;winNameSilhouette[]&nbsp;=&nbsp;&quot;Silhouette&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvNamedWindow(winNameCapture,&nbsp;0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvNamedWindow(winNameSilhouette,&nbsp;0);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!isStop){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;img&nbsp;=&nbsp;cvQueryFrame(capture);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(img&nbsp;==&nbsp;NULL)&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvConvert(img,&nbsp;imgTmp);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;輝度範囲<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvSub(imgAverage,&nbsp;imgSgm,&nbsp;img_lower);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvSubS(img_lower,&nbsp;cvScalarAll(Zeta),&nbsp;img_lower);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvAdd(imgAverage,&nbsp;imgSgm,&nbsp;img_upper);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvAddS(img_upper,&nbsp;cvScalarAll(Zeta),&nbsp;img_upper);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvInRange(imgTmp,&nbsp;img_lower,&nbsp;img_upper,&nbsp;imgSilhouette);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;輝度振幅<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvSub(imgTmp,&nbsp;imgAverage,&nbsp;imgTmp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvPow(imgTmp,&nbsp;imgTmp,&nbsp;2.0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvConvertScale(imgTmp,&nbsp;imgTmp,&nbsp;2.0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvPow(imgTmp,&nbsp;imgTmp,&nbsp;0.5);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;背景領域を更新<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvRunningAvg(img,&nbsp;imgAverage,&nbsp;BG_RATIO,&nbsp;imgSilhouette);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvRunningAvg(imgTmp,&nbsp;imgSgm,&nbsp;BG_RATIO,&nbsp;imgSilhouette);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;物体領域を更新<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvNot(imgSilhouette,&nbsp;imgSilhouetteInv);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvRunningAvg(imgTmp,&nbsp;imgSgm,&nbsp;OBJ_RATIO,&nbsp;imgSilhouetteInv);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvErode(imgSilhouette,&nbsp;imgSilhouette,&nbsp;NULL,&nbsp;1);&nbsp;//&nbsp;収縮<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvDilate(imgSilhouette,&nbsp;imgSilhouette,&nbsp;NULL,&nbsp;2);&nbsp;//&nbsp;膨張<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvErode(imgSilhouette,&nbsp;imgSilhouette,&nbsp;NULL,&nbsp;1);&nbsp;//&nbsp;収縮<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvMerge(imgSilhouette,&nbsp;imgSilhouette,&nbsp;imgSilhouette,&nbsp;NULL,&nbsp;imgResult);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvShowImage(winNameCapture,&nbsp;img);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvShowImage(winNameSilhouette,&nbsp;imgResult);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;waitKey&nbsp;=&nbsp;cvWaitKey(33);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(waitKey&nbsp;==&nbsp;&#8217;q')&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(waitKey&nbsp;==&nbsp;&#8217;&nbsp;&#8217;){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isStop&nbsp;=&nbsp;!isStop;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isStop)&nbsp;printf(&quot;stop&yen;n&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;printf(&quot;start&yen;n&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvReleaseCapture(&amp;capture);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvDestroyWindow(winNameCapture);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvDestroyWindow(winNameSilhouette);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
}<br />
</p></blockquote>
<p>
<br />
<br />
■C#でFormアプリを作る<br />
新しいプロジェクトを作る。<br />
ソリューションエクスプローラで[参照設定]→[プロジェクト参照]でShadowCameraを参照。<br />
<a href="http://www.flickr.com/photos/shokai/3470892320/" title="Cで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC#から使う by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3497/3470892320_427521cbab.jpg" width="246" height="236" alt="Cで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC#から使う" /></a><br />
なお、同一Solution内ならプロジェクト参照が便利だけど、<br />
ReleaseにShadowCamera.dllができているのでそれを他の人に配布して、[ファイルを参照]してもらってdllから呼び出してもらっても同じ機能が使えます<br />
<br />
<br />
ボタンを1つ置く。buttonStartという名前にして、ダブルクリックしてクリックイベントの雛形を作る<br />
<a href="http://www.flickr.com/photos/shokai/3470835562/" title="Cで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC#から使う by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3553/3470835562_906e5d2262.jpg" width="464" height="494" alt="Cで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC#から使う" /></a><br />
<br />
<br />
<br />
ShadowCameraを読み込んで<br />
</p>
<blockquote><p>using ShadowCamera;</p></blockquote>
<p>
<br />
新しいCameraクラスのインスタンスを作って、startButtonイベント内でさっき作ったrunCapture関数を呼ぶようにする<br />
<a href="http://shokai.org/projects/opencv-study/index.cgi/file/7537970cfc6b/ShadowCameraSample/ShadowCameraForm.cs#l1">OpenCV Study: 7537970cfc6b ShadowCameraSample/ShadowCameraForm.cs</a><br />
</p>
<blockquote><p>
using&nbsp;System;<br />
using&nbsp;System.Collections.Generic;<br />
using&nbsp;System.ComponentModel;<br />
using&nbsp;System.Data;<br />
using&nbsp;System.Drawing;<br />
using&nbsp;System.Linq;<br />
using&nbsp;System.Text;<br />
using&nbsp;System.Windows.Forms;<br />
using&nbsp;ShadowCamera;<br />
<br />
namespace&nbsp;ShadowCameraSample<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;partial&nbsp;class&nbsp;ShadowCameraForm&nbsp;:&nbsp;Form<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Camera&nbsp;cam;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ShadowCameraForm()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cam&nbsp;=&nbsp;new&nbsp;Camera();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;buttonStart_Click(object&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cam.runCapture();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</p></blockquote>
<p>
<br />
<br />
ShadowCameraSampleを（右クリックして）スタートアッププロジェクトに設定し、<br />
ビルドするとShadowCameraFormが起動する。ボタンを押すとしばらくカメラを読み込んで、数秒後にOpenCVのHighGUIのウィンドウが起動するはず。<br />
<a href="http://www.flickr.com/photos/shokai/3470022957/" title="Ｃで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC#から使う by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3499/3470022957_55c118a20c.jpg" width="500" height="249" alt="Ｃで書いたOpenCVのコードをC++/CLIで.NET用DLLにしてC#から使う" /></a><br />
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/4477/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

