Google Code Prettify

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

下面是存圖片檔案





















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






2013年10月29日 星期二

OpenCV 2.4.6 + visual studio 2012 安裝教學



安裝環境:

windows7 32bit

visual studio 2012 express



1.下載opencv: http://opencv.org/



2.會用到的資料夾:

解壓縮下載回來的opencv壓縮檔

你會用到的安裝設定檔都放在 build 這個資料夾裡




























include檔在 include資料夾內

linker 的lib檔 在x64(64位元) 和 x86(32位元) 資料夾內



























linker 的lib檔在lib資料夾內

環境變數要設定的path在bin資料夾內























3.開始設定環境

開啓主控台應用程式































在專案按下屬性(property)

記得在組態上選擇 debug release

一般我會建議使用release


C/C++   ->   一般(general)   ->   include 目錄

include 以下三個資料夾的位置:

略.../build/include/

略.../build/include/opencv/

略.../build/include/opencv2










連結器(linker)  

連結器  ->  一般  -> 其他程式庫目錄

依你要編譯的位元

選擇以下資料夾路徑:

32bit:  

略.../build/x86/vc10/lib/

64bit:  

略.../build/x64/vc10/lib/



連結器  ->  輸入(input)  ->  其它相依性

加入 lib 資料夾內的 lib 名稱:

裡面有很多lib可以使用,這裡先放比較常用的,有需要可以自行增加

debug:

opencv_calib3d246d.lib
opencv_core246d.lib
opencv_contrib246d.lib
opencv_features2d246d.lib
opencv_highgui246d.lib
opencv_imgproc246d.lib

release:

opencv_calib3d246.lib
opencv_core246.lib
opencv_contrib246.lib
opencv_features2d246.lib
opencv_highgui246.lib
opencv_imgproc246.lib




環境變數設定

在我的電腦  ->  系統內容   ->  進階  -> Path

加入兩個資料夾位置: (路徑用分號 ; 分開)

32bit:  

略.../build/x86/vc10/bin/

64bit:  

略.../build/x64/vc10/bin/


設定到這邊就完成設定囉XD!



4.開始編譯
// opencv_setup_turtorial.cpp : 定義主控台應用程式的進入點。
//

#include "stdafx.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

int main(int argc, _TCHAR* argv[])
{
    Mat src;                     //宣告MAT
    src = imread("lena.jpg");    //讀取圖片
    imshow("result",src);        //SHOW圖片
    waitKey();                   //要輸入才能看見圖片顯示
    return 0;
}



執行編譯後,記得把圖片放到exe的資料夾中

接著執行程式,如果看得到圖片就大功告成囉!!



2013年10月22日 星期二

OpenCV overlay string 在圖片上寫字



我們在處理圖片時,有時候想在在圖片上嵌入文字,

這在OPENCV裡面已經都包成一行式子了,非常方便

以下就是各種文字風格的展現:

code:

//
//  opencv 2.4.6 Extract Color
//
//  Created by vince on 13/10/22.
//  Copyright (c) 2013年 vince. All rights reserved.
//
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include 

using namespace cv;
using namespace std;

int main()
{
    Mat src;
    //原圖片
    
    cv::Scalar c = cv::Scalar(0,255,0);
    //要寫在圖片上的文字顏色 依序為 (B, G, R)
    
    src=imread("/Users/mac/Documents/MyCode/OpenCV/apple.jpg");
    //讀取圖片
    
    putText(src,"COMPLEX" ,      Point(20,40),  FONT_HERSHEY_COMPLEX ,       1,c);
    putText(src,"COMPLEX_SMALL" ,Point(20,80),  FONT_HERSHEY_COMPLEX_SMALL , 1,c);
    putText(src,"DUPLEX"   ,     Point(20,120), FONT_HERSHEY_DUPLEX ,        1,c);
    putText(src,"PLAIN"   ,      Point(20,160), FONT_HERSHEY_PLAIN ,         1,c);
    putText(src,"SCRIPT_COMPLEX",Point(20,200), FONT_HERSHEY_SCRIPT_COMPLEX ,1,c);
    putText(src,"SCRIPT_SIMPLEX",Point(20,240), FONT_HERSHEY_SCRIPT_SIMPLEX ,1,c);
    putText(src,"SIMPLEX" ,      Point(20,280), FONT_HERSHEY_SIMPLEX ,       1,c);
    putText(src,"TRIPLEX" ,      Point(20,320), FONT_HERSHEY_TRIPLEX ,       1,c);
    //     圖片 要寫的文字,記得""  文字要寫的位置,左上(0,0)  文字風格         放大倍率 顏色
      
    imshow("my text",src);//show圖片

    waitKey();
}


2013年10月17日 星期四

C/C++ 製作 DLL 教學


動態連結函式庫(Dynamic Linking Library, DLL)

就是我們常聽到的DLL,而DLL的連結可以分成兩種:

動態連結DLL(dynamic linking DLL)靜態連結DLL(static linking DLL)

而動態連結DLL又分成 顯式加載 隱式加載

這邊要介紹的是 隱式加載 的 動態連結DLL


製作DLL:

1.建立新專案,開啟win32主控台應用程式
























2.選擇DLL後按完成




























3.進入後在專案上按右鍵,新增一個標頭檔(.h),名字就跟DLL的名字一樣

























4.在標頭檔(.h)中宣告 DLL的方法,並且定義DLLIMPORT(可自行更改名字)

在方法的前面,將DLL的方法做輸出



























5.在DLL的.cpp檔中寫方法的內容,並且記得include 你的標頭檔 (.h),到這邊就可以

正常compiler你的DLL檔囉!!



























6.你會在你的專案中找到你製作的DLL和你DLL的.lib檔



















接下來就是正式的呼叫你做的DLL來作使用囉~~



呼叫DLL:

1.建立新專案,一樣是win32主控台應用程式
























2.這邊是勾選 主控台應用程式



























3.先在專案的屬性(property) -->  C/C++  -->  一般 (general)  -->其他Include目錄

將你剛剛做的DLL的(.h)檔的位置include進來
























4.在連結器(linking) --> 一般(general)  --> 其他程式庫目錄

在這邊將你剛剛製作的DLL的(.lib)檔的路徑加進來

























5.在連結器(linking) --> 輸入(input) -->其它相依性(additional dependencies)

輸入你剛剛製作的DLL(.lib)檔的名字  ex: xxx.lib




























6.程式中記得include你的DLL的(.h)

接下來你就可以呼叫DLL中的方法來使用了


























7.compiler完,記得將你剛剛製作的DLL放在你的EXE檔的同一個資料夾中




















8.執行程式,可以看到DLL呼叫成功囉!!!








2013年10月2日 星期三

C# using gmail to send email 用gmail信箱寄信


編譯環境

visual C# 2010 express

.net framework 4.0(可以向下相容)



新建專案->選擇console application



code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;  //記得要加這個命名空間

namespace send_google_email_example
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Net.Mail.SmtpClient my_mail = new

  System.Net.Mail.SmtpClient("smtp.gmail.com", 587);

 //建立 SmtpClient 物件 並設定 Gmail的smtp主機及Port,如果用gmail 這邊直接用預設,
不用修改

            my_mail.Credentials = new System.Net.NetworkCredential("自己的gmail信箱",

"自己的密碼");     //輸入自己的gmail信箱和密碼

            my_mail.EnableSsl = true;//Gmial 的 smtp 使用 SSL,直接用預設,不用修改

            my_mail.Send("發送時自己顯示的名字<testtest@gmail.com>" , "收件者的名字<hellohello@ntu.edu.tw>" ,  "信箱標題" ,  "信件內容");      //發送Email    
        }
   }
}

C/C++ typedef , struct , typedef struct 差別



一開始在摸C和C++時,常常搞混typedef , struct , typedef struct 的差別

這邊來做一下簡單的說明:



-----typedef-----

typedef 可以用來幫某種類型取名字

例如


typedef int Jack;  // 幫int取名叫Jack


因此我們就可以在設定變數時用Jack這個類型:

Jack age;     //age的型別是 int



-----struct-----

struct 可以建立一個多種類型的結構 (把它想成幫一群人取名字)

struct family{

int Ken;

float Sam;

};     //別忘了結尾要加分號


因此我們就可以在設定變數時用family這個結構:

這邊重點就來了,C和C++在宣告結構的變數時,有點不同,

C的宣告方式比較嚴謹:

C:

struct family Chen;    //Chen的型別是family這個結構,而family的型別是struct

C++:

family Chen;             //Chen的型別是family這個結構


因此有時候為了方便,我們可以在宣告結構時,就一起宣告變數,

這宣告結構變數的方式在C和C++都一樣:

struct family{

int Ken;

float Sam;

}; Chen                 //Chen的型別是family這個結構




當我們要呼叫Chen裡的成員時,只要用 .  來呼叫:

Chen.Ken=10;      //設定Ken=10;



-----typedef struct-----

這就是結合 typedef 和 struct 的一種方式,直接幫結構命名

在C和C++都一樣:

typedef struct family{

int Ken;

float Sam;

}Asia;    //把family這個結構命名為Asia


因此如果要建立family的結構變數時:

Asia Chen;    //沒加typedef之前,要用family Chen宣告 

要呼叫Chen的成員時,一樣只要用 . 來呼叫

Chen.Sam=10.5;