Google Code Prettify

2013年11月20日 星期三

OpenCV 2.4.7 Webcam Capture


OpenCV2.4.6在MAC OS下自己實測過開啓webcam,感覺無法使用,

於是在OpenCV 2.4.7 一安裝完後,馬上就來實際測試一下,

結果可以順利截取影像囉XD


編譯環境為:

mac lion mountain 10.8

opencv 2.4.7

Xcode 4.6(在這邊基本上相容visual c++)


Code:

//Created by vince 
//Copyright (c) 2013年 vince. All rights reserved.

#include "opencv2/highgui/highgui.hpp"

using namespace cv;

int main()
{
    Mat image;
    
    VideoCapture cap;      //capture的宣告
    cap.open(0);           //0 為預設camera
    
    while(cap.isOpened())  //確認camera能開啓
    {
        cap>>image;        //截取影像到image裡方法1
        //cap.read(image); //截取影像到image裡方法2
        //以上兩種方法都可以用,實測過沒問題!
        
        imshow("Webcam live", image);
        
        waitKey(33);//避免CPU負荷,給點delay時間
                    //實際上一般webcam的framerate差不多33ms
    }
    
    return 0;
}

OpenCV 2.4.7 + mac Xcode 4.6 安裝教學


在安裝完 OpenCV 2.4.7 windows 版後,

馬上就來實驗看看MAC的OpenCV 2.4.7版有沒有什麼不一樣,

發現安裝方式跟OpenCV2.4.6完全一樣喔

需要安裝的人可以參考我這篇:OpenCV 2.4.6 + mac Xcode 4.6 安裝教學


如果安裝上有什麼問題可以再寫信問我,畢竟我也曾經花超久時間再安裝上面過XD

Mac 實用技巧 在終端機下開啓資料夾 Open Finder in Current Folder from Terminal


在終端機下

開啓 Finder

>>>cd path

>>>open.



查看目前所在資料夾

>>>pwd


查看目前資料夾檔案

>>>ls



>>>ls -al  (可看到更多資料夾資訊)


在終端機下進入資料夾

可以直接把資料夾拖曳到終端機中,

就會出現路徑了,只要前面加個 cd

就能進入此資料夾

2013年11月19日 星期二

C# visual studio 2012 EmuCV 安裝教學 與 Emgu.CV.CvInvoke 解決


EmguCV 是從 OpenCV裡包成專給 C#用的一個函式庫,

功能可以說是非常強大,可以稱得上是目前用C#學影像處理必學的 open source

可惜的是它的語法方式比較像是舊版OpenCV C-Style的風格改編,

如果一開始就是學C++-Style的人在上手方面可能會覺得比較陌生,

不過還是大力推薦它!!


編譯環境

windows7 64bit

emgucv 2.4.9 beta

visual studio 2112 express


1.先下載 EmguCV 函式庫

2.在我的電腦裡設定環境變數

在解壓縮資料夾中,找到:

..\EmguCV\bin

..\EmguCV\bin\x64    (for 64位元)

..\EmguCV\bin\x86    (for 32位元)



3.在專案上增加參考路徑(reference path)

在專案上按右鍵,選擇屬性(property) ,把bin資料夾內要使用的版本資料夾加進來



4.加入參考 dll

在專案上按右鍵,Add reference



5.加入UI Tool

在工具(tool) -> Choose Tool Items

加入Emgu.CV.UI.dll

加入後可以在 form 的工具列看到多了幾樣UI 選擇



6.開始編譯

到這邊就已經完成囉,這邊示範的程式是

按下open按鈕,就可以開啟對話窗選擇圖片,把它讀進 pictureBox 裡

Code:

//  Created by vince 
//  Copyright (c) 2013年 vince. All rights reserved.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using Emgu.CV;           //for emguCV
using Emgu.CV.Structure; //for Bgr

namespace c_sharp_emgucv_setup
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {            
            OpenFileDialog filename = new OpenFileDialog();
            if (filename.ShowDialog() == DialogResult.OK)
            {
                string name = filename.FileName;
                Image img = new Image(name);
                pictureBox1.Image = img.ToBitmap();
            }
            
        }
    }
}


7.執行結果


看到圖就代表成功囉!!


8.特殊情況

有些人會在編譯成功後,執行時跳出

Emgu.CV.CvInvoke 的錯誤訊息,

可以試著把 ..bin\x64 (64 位元) 或 ..bin\x86 (32 位元)  資料夾中所有相關的

opencv_core249.dll
opencv_imgproc249.dll
......

等相關opencv_ 開頭的dll 直接丟進編譯後產生出來的debug 或release資料夾,

再執行一次應該就可以了!!(我在windows7 32bit 的電腦裡有實際用過,有成功)




OpenCV 2.4.7 + visual studio 2012 安裝教學


OpenCV 2.4.7 在上禮拜更新了,當然馬上就下載來安裝看看有沒有問題囉!

實際測試的安裝方式與OpenCV 2.4.6 的安裝方法一樣,

所以可以直接參考這篇囉 : OpenCV 2.4.6 + visual studio 2012 安裝教學


編譯環境:

windows7 32bit

opencv 2.4.7

visual studio 2012 express


這次有用mac air 在 bootcamp 下安裝windows7 64bit版本,發現會有link error的問題,

這個問題等解決的再來PO分享!


這次的資料夾結構與2.4.6有稍微的不一樣,變得簡潔多了,

一樣只要用到 build 資料夾內的資料而已,






其他的步驟就接參考這篇吧 :  OpenCV 2.4.6 + visual studio 2012 安裝教學

2013年11月18日 星期一

SQLite Database Browser 可以看資料庫的.db檔案


如果自己用 SQLite 建立資料庫 .db 檔時,一般的記事本是無法開啟的,

這時候你就需要下載 SQLite Database Browser ,它是免安裝的,

如果還不知道怎麼使用 SQLite 建立資料庫,

請參考這篇: C# SQLite 教學 SQLite tutorial


1.下載  SQLite Database Browser

2.開啟你的.db檔





在裡面不僅可以查看,也可以直接做修改喔!


C# SQLite 教學 SQLite tutorial



SQLite 是一個功能強大的資料庫 open source,而且安裝空間小,

是我目前最常用的資料庫 lib ,輕巧方便攜帶性高,

美中不足的地方是目前 C# 版只有支援到 .Net 3.5 和 .Net 2.0


編譯環境

windows7 64bit

.Net Framework 3.5

visual studio 2012 express


1.下載 ADO.NET 2.0 Provider for SQLite 並安裝它

2.引用 System.Data.SQLite.dll

   32 bit : ../bin/System.Data.SQLite.dll

   64 bit: ../bin/x64/System.Data.SQLite.dll

3.Code

//  Created by vince 
//  Copyright (c) 2013年 vince. All rights reserved.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.IO;// for check file exist
using System.Data.SQLite;//for SQLite

namespace c_sharp_sqlite
{
    public partial class Form1 : Form
    {
        private SQLiteConnection sqlite_connect;
        private SQLiteCommand sqlite_cmd;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (!File.Exists(Application.StartupPath + @"\myData.db"))
            {
                SQLiteConnection.CreateFile("myData.db");
            }

            string name = textBox1.Text;
            string phone_number = textBox2.Text;

            sqlite_connect = new SQLiteConnection("Data source=myData.db");
            //建立資料庫連線

            sqlite_connect.Open();// Open
            sqlite_cmd = sqlite_connect.CreateCommand();//create command
            
            sqlite_cmd.CommandText = @"CREATE TABLE IF NOT EXISTS phone (num INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, phone_number TEXT)";
            //create table header
            //INTEGER PRIMARY KEY AUTOINCREMENT=>auto increase index
            sqlite_cmd.ExecuteNonQuery(); //using behind every write cmd

            sqlite_cmd.CommandText = "INSERT INTO phone VALUES (null, '" + name + "','" + phone_number + "');";
            sqlite_cmd.ExecuteNonQuery();//using behind every write cmd

            sqlite_connect.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            sqlite_connect = new SQLiteConnection("Data source=myData.db");
            //建立資料庫連線
            sqlite_connect.Open();// Open
            sqlite_cmd = sqlite_connect.CreateCommand();//create command

            sqlite_cmd.CommandText = "SELECT * FROM phone"; //select table

            SQLiteDataReader sqlite_datareader = sqlite_cmd.ExecuteReader();

            while (sqlite_datareader.Read()) //read every data
            {
                String name_load = sqlite_datareader["name"].ToString();
                String phone_number_load = sqlite_datareader["phone_number"].ToString();
                MessageBox.Show(name_load + ":" + phone_number_load);
            }
            sqlite_connect.Close();
        }
    }
}

5.執行結果

write:



read:


可以到release資料夾裡,會發現建立的myData.db跑出來了喔,

如果想要看它裡面的內容,可以參考這篇 : SQLite Database Browser 可以看資料庫的.db檔案




C# 用 ZXing 產生 QR Code QR Code generator using ZXing



最近在產生QR code時發現了一個不錯的open source,

就是  ZXing.Net 

它可以支援 .net2.0, 3.5, 4.0, 4.5, 而且又是免費的,

程式碼也非常簡單喔!

網路上有很多分享都是 using com.zxing,好像在現在新的版本已經不適用了



編譯環境:

windows7 64bit

.Net Framework 4.5

visual studio 2012 express

ZXing.Net.0.12.0.0


1.下載 ZXing.Net 

2.把DLL加到專案中

依造自己的 .Net Framework 來選擇 DLL



3.Code

//  Created by vince 
//  Copyright (c) 2013年 vince. All rights reserved.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using ZXing;                  // for BarcodeWriter
using ZXing.QrCode;           // for QRCode Engine

namespace qrcode_tutorial
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e) 
        {
            var writer = new BarcodeWriter  //dll裡面可以看到屬性
            {             
                Format = BarcodeFormat.QR_CODE,
                Options = new QrCodeEncodingOptions //設定大小
                {
                    Height = 300,
                    Width = 300,
                }
            };
            pictureBox1.Image = writer.Write(textBox1.Text); //轉QRcode的文字             
        }
    }
}



4.執行結果


Arduino 具有模擬功能的 arduino 線上模擬程式123D Circuits


前這陣子才入手 arduino 在玩,

有時候線接了一大堆,才發現有小地方接反,花了滿多時間debug,

後來就一直想說有沒有一種模擬程式可以模擬結果的,

想不到今天剛好就看到啦,而且是線上版免下載的喔!

網址在這:123D Circuits


選擇 sign up for 123D Circuits



可以註冊或用facebook登入




選擇 New circuit





選擇 Arduino + breakboad...

Create New! 就可以進行編輯了喔!







2013年11月17日 星期日

C# 開啟 outlook 與網頁 open outlook and website


在做網頁的開啟或 outlook 的呼叫時,

System.Diagnostic 的命名空間中裡的 Process 類別,可以簡單的幫我們處理


編譯環境

windows7 64bit

.Net Framework4.5(測到.Net3.5都能用)

visual studio 2012 express





Code:

//  Created by vince 
//  Copyright (c) 2013年 vince. All rights reserved.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;  //使用process需增加

namespace c_sharp_outlook_tutorial_and_website
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string mailInfo = string.Format("mailto:{0}?Subject={1}&Body={2}", "vince@mail.com", "test", "hello!");
            Process myProcess = new Process();
            myProcess.StartInfo.FileName = mailInfo.ToString();
            myProcess.Start(); //執行
            myProcess.Dispose();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("www.google.com.tw"); //一行開啟網站
        }
    }
}



2013年11月14日 星期四

C# 取得電腦上所有serial port


Mac Air本身沒有serial port可以使用,而剛好最近在玩Arduino開發版,

剛好可以用 C# 來跟我的 Arduino 通訊

不過這邊先簡單介紹怎麼取得電腦上所有的 serial port,

順便複習一下combobox 和 listbox


首先這邊先建立Windows Form Application

介面就簡單如圖所示:


Code:
//  Created by vince 
//  Copyright (c) 2013年 vince. All rights reserved.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports; //要使用serial port需要引用它

namespace c_sharp_searchSerialPort
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            string [] myPorts = SerialPort.GetPortNames(); //取得所有port的名字的方法

            comboBox1.DataSource = myPorts;   //直接取得所有port的名字
            listBox1.DataSource = myPorts;

            foreach (string port in myPorts)  //使用迴圈方式取得所有port的名字
            {
                comboBox2.Items.Add(port);    //一個一個增加
                listBox2.Items.Add(port);
            }

        }
    }
}


結果如下,可以發現直接指定所有port給combobox1(左邊),它會有預設的port跑出來,

而用迴圈添加的port給combobox2(右邊),它預設是空白,

直接指定所有port給listbobox1(左邊),它會預設選取 port 的名稱




2013年11月12日 星期二

MAC實用技巧 mac 與 windows 7 雙系統下 螢幕截圖


使用MAC時,少了 print screen 這顆鍵,截圖起來頗不順手的,

組合鍵還滿容易忘記的,這邊就做簡單的小記錄分享:



MAC 系統:

command + shift + 3 : 截取整個螢幕到桌面,雙螢幕就會一次存兩張圖下來

command + shift + 4 : 按下會出現十字靶標,可以自己框選要截圖的範圍




WINDOWS 系統: 

fn + shift + F11  : 截取整個螢幕到剪貼簿,可以貼到小畫家(等同 print screen 鍵)

fn + option + shift + F11  : 截取目前使用視窗到剪貼簿,可以貼到小畫家


2013年11月11日 星期一

Labview Call DLL 呼叫DLL



在使用Labview的時候,常會有些 open souce 的 lib 功能是 Labview 沒有的,

這邊簡單介紹怎麼呼叫 DLL 到 Labview 作使用


這裡就直接用 C/C++ 製作 DLL 教學 做的DLL來當範例

不過要注意,當初DLL是編譯成32位元的,如果 Labview 環境是64位元,

要記得重新編譯DLL喔!



編譯環境

windows 7

Labview 2013 64bit


DLLIMPORT int add(int x,int y) //這邊是這次使用的dll的方法
{
 return x+y;
}

1.增加 Call library VI






















2.連結至 DLL,並選擇使用的方法名稱




3.設定回傳 (return) 的類型























我們 DLL 的 add 方法中回傳類型是 int

因此Labview這邊 Type 要選擇 Numeric ,Data type 要選擇 Integer類的


4.設定傳入參數























在我們的DLL中有兩個參數,int a 和 int b,


跟回傳值的設定一樣 Type 要選擇 Numeric ,Data type 要選擇 Integer類的,

要注意的是,Pass 是選擇傳入的是 值 還是 指標


5.Block Diagram 設置





















執行後就可以看到結果囉XD


C# webcam snapshot and save image to bitmap using aforge



在WINDOWS下做WEBCAM 影像的擷取,比較常見的就是用DirectShow或EmguCV,

最近突然發現有一個還不錯的open souce可以擷取webcam影像,而且大小不到50mb

它就是 aforge,這次就決定用它來示範怎麼做影像擷取與存圖!



編譯環境:

windows 7

visual studio 2012 express

aforge .net Framework-2.2.5


1.到  aforge 官網下載最新版.net Framework 並安裝


2.開啟新專案,選擇 Windows Form Application


3.把DLL加進Project

PROJECT  ->  Add Reference   ->   Browse

到 AForge.NET 的安裝目錄下,AForge.NET\Framework\Release,

將  AForge.Video.DirectShow.dll  和  AForge.Video.dll  加進來





















































4.UI介面設計

這邊我們只要簡單加入picture box 和 3個 button 就可以了,接著可以對物件按右鍵,

選擇 property,更改名稱,比較不容易在寫程式的時候搞混




































5.Code
//  Created by vince on 13/11/10.
//  Copyright (c) 2013年 vince. All rights reserved.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using AForge.Video;             //記得加入1
using AForge.Video.DirectShow;  //記得加入2

namespace aforge_webcam_tutorial
{
    public partial class Form1 : Form
    {
        public VideoCaptureDevice cam = null; //global
        public FilterInfoCollection usbCams;  //global
        Bitmap image_from_cam;                //global

        public Form1()
        {
            InitializeComponent();
        }

        void got_frame(object sender, NewFrameEventArgs eventArgs)
        {
            image_from_cam = (Bitmap)eventArgs.Frame.Clone();
            pictureBox1.Image = image_from_cam;
        }

        private void startButton_Click(object sender, EventArgs e)
        {
            usbCams = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            cam = new VideoCaptureDevice(usbCams[0].MonikerString);
            cam.NewFrame += new NewFrameEventHandler(got_frame);//註冊事件(got_frame)
            cam.Start();
        }

        private void stopButton_Click(object sender, EventArgs e)
        {
            cam.Stop();  
        }

        private void saveButton_Click(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();
            if (sfd.ShowDialog(this) == DialogResult.Cancel) //按下取消鍵時返回
            {
               return;
            }
            image_from_cam.Save(sfd.FileName);//存圖,副檔名記得給他.bmp
        }
    }
}



執行下去就可以直接跑囉XD

下面是存圖片檔案





















下面這張是拍下來存起來的圖片