FC2カウンター

現在の訪問者数

現在の閲覧者数:

カレンダー

10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -

プロフィール

剣菱P

Author:剣菱P
剣菱Pと申します。
性別:男
年齢:27
二兎を追って一兎も得られないタイプ

マイコンやプログラミング、ニコニコ動画、雑記等
方向性は見えずとも、ちょっとずつ更新していく予定です!

リンクフリーです。
こんなブログでよかったらよろしくお願いしま~す。

公開メール kenbishiP@gmail.com

検索フォーム

最新記事

最新コメント

カテゴリ

メールフォーム

名前:
メール:
件名:
本文:

月別アーカイブ

最新トラックバック

リンク

ブロとも一覧

ブロとも申請フォーム

ランキング

ランキング参加中です。気が向いたらクリックしてあげてください。


にほんブログ村 その他趣味ブログへ
にほんブログ村 その他趣味ブログ 趣味の工作へ

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


Drawing.dllが開けない


さて、昨日dllを作ることでなんとか問題が解決しそうだと喜んだわけですが

案の定今日も問題にぶち当たる

勉強になっていいとは思うのですが、あんまり進まないのもきついなぁw



VC++2010でdllをつくろうと思ったのですが

System::Drawing名前空間が認識してくれない

昨日2つ手段があるといったクラスライブラリと win32アプリケーションの作成

初めはクラスライブラリで作ろうと思ったのですが、Drawingが認識しないので

試しにwin32の方でやってみても やっぱり認識しない

win32の方はとりあえず、Frameworkを使わないとSystem::Drawingが見えないのはわかったので

201005244.jpg
共通言語ランタイムサポートを (/clr)にしました

これでSystemは認識してくれたのですが

Drawingはだめ
201005243.jpg

もしやと思って 参照から Drawing.dllを追加
201005241.jpg

これでいけるか と思ったら
201005242.jpg

Drawingは開けないと来たもんだ

くっ

openCVのラッパーとやらを使えばC#でもopenCVが使えるみたいなので それも考慮に入れてもう少し粘ってみます

スポンサーサイト

シリアル通信やっと出来た


やっとシリアル通信が再びつながりました

ってか、実は詳しくはまだ良くわかってませんw

こうやったら出来るよというのを参考にしたら出来ましたが、なぜそうなるのか
まだわかってないのです

とりあえず自分の覚書としてコードを書きます

#pragma endregion
private: System::Void hScrollBar1_Scroll(System::Object^  sender, System::Windows::Forms::ScrollEventArgs^  e) {           
           
            String ^ s_data1 = textBox1->Text;
            data1 = hScrollBar1->Value;
            textBox1->Text = data1.ToString("D3");
            serialPort1->Write("A"+s_data1+"   \r\n");
         }
private: System::Void hScrollBar2_Scroll(System::Object^  sender, System::Windows::Forms::ScrollEventArgs^  e) {
             String ^s_data2 = textBox2->Text;
             data2 = hScrollBar2->Value;
            textBox2->Text = data2.ToString("D3");
            serialPort1->Write("B"+s_data2+"   \r\n");
         }
private: System::Void hScrollBar3_Scroll(System::Object^  sender, System::Windows::Forms::ScrollEventArgs^  e) {
             String ^s_data3 = textBox3->Text;
             data3 = hScrollBar3->Value;
            textBox3->Text = data3.ToString("D3");
            serialPort1->Write("C"+s_data3+"   \r\n");
         }
private: System::Void hScrollBar4_Scroll(System::Object^  sender, System::Windows::Forms::ScrollEventArgs^  e) {
             String ^s_data4 = textBox4->Text;
             data4 = hScrollBar4->Value;
            textBox4->Text = data4.ToString("D3");
            serialPort1->Write("D"+s_data4+"   \r\n");
         }
private: System::Void hScrollBar5_Scroll(System::Object^  sender, System::Windows::Forms::ScrollEventArgs^  e) {
             String ^s_data5 = textBox5->Text;
             data5 = hScrollBar5->Value;
            textBox5->Text = data5.ToString("D3");
            serialPort1->Write("E"+s_data5+"   \r\n");
         }
private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
            serialPort1->Open();
            textBox11->Text = "ポートオープン";
           
         }


delegate void SetTextCallback(String ^);

private: void SetText(String^ str){
             
            array<Char> ^data = str->ToCharArray();

            switch(data[0]){
                case 'A': textBox6->Text = str->Substring(1,3);break;
                case 'B': textBox7->Text = str->Substring(1,3);break;
                case 'C': textBox8->Text = str->Substring(1,3);break;
                case 'D': textBox9->Text = str->Substring(1,3);break;
                case 'E': textBox10->Text = str->Substring(1,3);break;
            }
         }

private: System::Void serialPort1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) {
           
             String^ str;
           
             str = serialPort1->ReadLine();
             this->Invoke(gcnew SetTextCallback(this,&Form1::SetText),str);
           
           
         }
private: System::Void Form1_FormClosing(System::Object^  sender, System::Windows::Forms::FormClosingEventArgs^  e) {
            serialPort1->Close();
         }




タチコマの操作パネルの基礎を想定しているので

スクロールバーを動かすとその値がシリアルで出力されて
受信した値を表示しています

201005181.jpg

一応うまくいったのですが、問題が一つ

スクロールバーをドラッグして動かした場合は問題ないのですが、
横のボタンで1づつ動かすと 値がずれます

なぜか次のクリックで前の値が出力されているよう

とりあえず、今回は疲れたのでそこは保留w


シリアルポートのエラー


タチコマ用の操作ソフトを作るため

VC++ 2008 のC++/CLIでシリアルポートを使ったプログラムを組んでみたところ

うまくいかない・・・

シリアルポートクラスは以前使った時特に問題なく使えたのに

今回はなぜ


すこし調べてみたところ

シリアルポートクラスの DataRecievedイベントは セカンダリスレッドで動くらしい

スレッドというものの概念をまだ理解していないが

セカンダリスレッドで動いているものがメインスレッド上のオブジェクトに働きかけようとするとエラーになるようだ

はてさて、

ではどうやってそれを許可すればいいのだろうか


ってか、この前作ったプログラムも大体同じようなことさせてたんだが・・・

あれはなぜうまくいったのか


目のプログラム その2


エラーが取れたので

さっそくフォーム上にカメラの映像を描画する基本プログラムを組んでみました

プログラムはこちら


IplImage *img;
CvCapture *src;

private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
               
                src = cvCaptureFromCAM(0);              //カメラを選択
                img = cvQueryFrame(src);                   //カメラの画像を1フレーム読み込む
                if(img == NULL){
                    textBox1->Text = "ファイルが読み込めません";
                }
               
                pictureBox1->Width = img->width;          //ピクチャーボックスのサイズを画像の幅に合わせる
                pictureBox1->Height = img->height;       //ピクチャーボックスのサイズを画像の高さに合わせる
       
                timer1->Interval = 33;                   //タイマーを33msごとにセット
                timer1->Start();                             //タイマースタート

             }
private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) {
                 img=cvQueryFrame(src);                                                          //1フレーム読み込み
                 Bitmap ^ bmp = gcnew Bitmap(img->width,img->height,img->widthStep,
                        System::Drawing::Imaging::PixelFormat::Format24bppRgb,IntPtr(img->imageData));          
                                                                                                                //ビットマップクラスの作成
                 pictureBox1->Image = bmp;                                                   //ピクチャーボックスに描画
             }
private: System::Void Form1_FormClosing(System::Object^  sender, System::Windows::Forms::FormClosingEventArgs^  e) {
                 cvReleaseCapture(&src);                                                         //カメラの開放
             }
}



初めはこんなのでうまくいくとは思わなかったのですが、
思いのほかうまくいってちょっとびっくり

s-201005122.jpg

このプログラムの要はビットマップクラスを使うこと

はっきり言って、プログラムはそんなに得意じゃないので クラスとかよくわかってなかったりしますww

このビットマップクラスのインスタンス(?)を初期化する書式がいくつかあるらしく

Bitmap(Image) や

Bitmap(Int32, Int32, Int32, PixelFormat, IntPtr)というのがあります。

イメージデータを持ってるなら Bitmap(Image)を使えばいいんでしょうが

今回はOpenCVの IplImage構造体の中からデータを持ってこなくてはならず

渡せるのはイメージのポインターなのです

そこでこの
Bitmap(Int32, Int32, Int32, PixelFormat, IntPtr) の出番というわけらしいのです

このIntPtrというのがまさにピクセルデータを格納する配列へのポインタらしいので

ここに引き渡せます

このビットマップクラスをピクチャーボックスのイメージにして

それを33msに一度の間隔で繰り返せば動画になると いう寸法みたいです

なんとなく初めのさわりなので、ピクチャーボックスのイメージプロパティに渡しちゃいましたが

複雑なことをするならグラフィッククラスを使った方がよいのかな?

まぁ、それは明日勉強すればいいや


目のプログラム 最初の壁


さて、openCVをつかって カメラの映像を取得するプログラムは難なく成功したわけですが、

コンソールアプリケーションではなくフォームアプリケーションを作りたい!


ってなわけで、

作ったプログラムを応用して フォームアプリケーションでのコーディングをしようとしたのです

が!


ここで最初の問題が


なんか変なエラーが・・・


C:\Program Files\Microsoft Visual Studio 9.0\VC\include\emmintrin.h(27) : fatal error C1189: #error : ERROR: EMM intrinsics not supported in the pure mode!


試しにプログラムを組んだはいいが、こいつがなかなか消えてくれない

何が悪いのかいまいちわからないから、 自分で記述したところをどんどん削っていくと

インクルードファイル
#include
#include
の存在がすでに気に食わないらしい

悩んで悩んで一時間後


プロジェクト(P)→ ×××のプロパティ → 構成プロパティの全般

共通言語ランタイム サポート を 共通言語ランタイム サポート(/clr)

にしたら無事エラーが消えました


なんとか一安心

出鼻くじかれるかと思ったw



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。