2016年11月28日 星期一

ASP.NET C# 動態新增textbox且讀取輸入的值

Default.aspx:


Default.aspx.cs:




Button1:動態新增一個textbox,ID="txt_1"
Button2:讀取txt_1.text放到label

程式碼:

 protected void Page_Load(object sender, EventArgs e)
    {
        if( ViewState["Ctl_count"]!=null)
        {
            TextBox txb = new TextBox();
            txb.ID = "txt_1";
            Panel1.Controls.Add(txb);
            ViewState["Ctl_count"] = 1;
        }
    }
    
    protected void Button1_Click(object sender, EventArgs e)
    {
        TextBox txb = new TextBox();
        txb.ID = "txt_1";
        Panel1.Controls.Add(txb);
        ViewState["Ctl_count"] = 1;
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
        TextBox txb = (TextBox)Panel1.FindControl("txt_1");
        Label1.Text = txb.Text;

    }


程式重點:


  • 由於動態新增的物件會在按Button2的時候,跑到Load整個洗掉,所以利用 ViewState["Ctl_count"] 來記錄擬新增了幾個物件。
  • 我這個範例固定新增一個看不太出來,但是如果是不能確定會新增幾個的時候就很需要了。
  • 如果是一開始就直接動態新增可以寫進Page_Init裡面。
  • 控制項的初始化(Initialize)的動作一定要放在 Page_Init 事件中!控制項的初始化也包括設定控制項的預設值(Default Value)。千萬不能將設定控制項初始值的程式碼寫在 Page_Load 事件裡,否則當 PostBack 回來的值會被 Page_Load 事件中的程式碼蓋掉。動態將控制項加入到 ASP.NET 頁面中「最好」在 Page_Load 事件中執行,以確保在後續事件中可以取得頁面中所有的控制項。==>這是網路上找的原話




2016年9月14日 星期三

ASP.NET 擴充套件-網頁文字編輯器CKEditor


下載:
官方網站:http://ckeditor.com/download









使用前:
把ckeditor_aspnet_3.6.6.2\bin\Release\CKEditor.NET.dll
加入工具箱內就可以用了
步驟:工具箱內隨意右鍵=>選擇項目=>瀏覽=>選CKEditor.NET.dll=>確定

使用:
<script src="//cdn.ckeditor.com/4.6.0/basic/ckeditor.js"></script>
<CKEditor:CKEditorControl ID="CKEditorControl1" runat="server"></CKEditor:CKEditorControl>

鬼屋-1

1.
[苗苗~人家有事跟你說~]
林守文勾上苗煜的肩膀,不過因為身高的障礙,踮著腳尖有點辛苦的感覺.
苗煜的臉黑了,拍掉林守文的手,道.
[不要叫我苗苗,多久了還沒改過來.]
林守文白嫩的娃娃臉皺了皺,道.
[好吧!苗苗,有個…要給你看,來我家一趟吧.]
[說了不准叫那小名的!]
很快地就來到林守文的家,照苗煜的話來說他家就一鬼屋,住在裡面的大概除了林守文跟他爺爺以外,都不是人,根據守文爺爺的話,我一個道士當然要跟鬼住在一起阿!以至於林守文現在鬼和人都有點分不太清楚…題外話了.
拉著苗煜上了二樓,走近他的床前,林守文一把掀開被子.
苗煜挑起眉,問道.
[你這麼急匆匆的就是要給我看這個…石頭?好吧,比較大的石頭.欸我說你是怎麼把它搬進你房間的?]
林守文一臉小媳婦樣的道.
[誰那麼閒搬石頭呢?況且那麼懶的我,怎麼可能做這活?他是自己出現的!]
[也是,還沒見過懶成跟你一樣的…你說什麼?自己出現的?]
苗煜細長的眼睛瞇了起來.
林守文點點頭道.
[真的,我吃完早餐想回來補眠,想不到我的床就被他佔了,讓小紫姐來幫我移都移不走,只好來找你了.]
苗煜瞪了一眼,道.
[小紫都搬不起來的東西,我哪搬的動?你還不如讓你爺爺來給你收拾.]
林守文徹底陰暗了.
[這不是爺爺不在嘛…在還叫你幹什麼阿…貼張符就解決了,唉你說我去睡你家好嗎?爺爺不知道什麼時候才回來喲…]
[不要.]
苗煜很爽快地拒絕了,林守文繼續苦苦哀求.
[拜託啦,我不會怕你對我幹嘛的!]
林守文信誓旦旦的道,苗煜臉上卻貌似有青筋冒起.
[我是怕你對我幹嘛好不?]
[拜託~]
[你家房間那麼多,隨便睡一間不就得了?]
[每一間都有人欸!]
[是鬼好嗎?]
[不管辣我只要跟你睡!!!]
在林守文棄而不捨的糾纏之下,苗煜還是答應了.不過他們突然發現,那石頭似乎…在動.
 [啊啊阿~好可怕石頭在動!!有鬼阿!!]
林守文緊張地抓緊苗煜的手,喊道.讓苗煜原本緊張的心情變成無言.
[我說你家不是到處都是鬼麼?]
[不一樣啦!嗚~]
大石頭震了震,好像是在發光,其實他們也不知道到底有沒有發光,就是覺得從那石頭上面傳來一種柔柔的氣息,就像是…母親在注視著孩子.突然他們有幾秒鐘沒有意識,不是昏迷,就是彷彿兩人同時發起呆來一樣,感覺不到周圍發生了什麼.
回過神,大石頭不見了,只見一個大約16歲的少年在剛剛石頭的位子上,眨眨眼睛看著兩個人.
[他是人嗎?]
[這得問你啊!你爺爺是道士你好歹也要分得出來吧?]
[我又不是!]
兩人正傷腦筋的不知道要怎麼辦,那少年開口道.
[你們是誰?]
林守文撇撇嘴道.
[是我要問你是誰吧?這裡是我家欸!]
[你家…?怎麼回事?]
少年有點不高興的甩頭喃喃自語,聽得出來是在抱怨.
[玄燁這斯明明答應過我要把蓬萊當作我的沉眠之地,怎麼會是你家?現在到底是什麼年代?]
林守文自動忽略少年的自言自語問道.
[你先說你是誰吧?我叫林守文,他是苗煜.]
少年從床上下來,看了他眼,道.
[辰軒.]
[額…守文去拿件衣服給辰軒吧…]
苗煜突然發現辰軒身上一絲不掛,對林守文講道.林沈文仔細看了一下辰軒的身材發現居然和自己差不多高…可能還比他高一些.讓林守文有點怨念.
[噢,那辰辰穿我的衣服吧!]
[該死的人類,本大爺的名字是辰軒!]
辰軒握緊從林守文手裡接過的衣服吼道.
[辰辰滿好的阿~]
疊字多好記多方便阿~
[滾一邊去!]
[呵呵辰辰你到底會不會穿衣服阿?要不要哥哥幫你?]
[渾蛋!離我遠一點!]
在辰軒對著衣服糾結無果之後,還是讓苗煜幫忙穿上了.
[你們這種衣服怎麼這麼奇怪一點都不好看!我不要穿!本大爺可是偉大的上古神獸,憑什麼跟你們一樣穿這麼醜的衣服!]
辰軒扭著身子不舒服的抱怨,苗煜本想用哄小孩的語氣安慰一下他,結果突然愣住.林守文則是直接的講了出來.
[上古神獸!?你到底是什麼奇怪的東西?]
[你才奇怪的東西全家都奇怪的東西!渾蛋!]

2.
自從女媧造人之後,他就常常的陷入沉睡,人類這種詭異的生物,幾乎把天地的靈氣消耗殆盡,漸漸的他清醒的時間漸漸地越來越短,而醒來之後所能掌控的力量也越來越小.
他曾經問過女媧,為什麼要創造出這麼恐怖破壞力簡直是惡魔的種族,女媧微微地笑著,卻像在哭,她摸摸他的頭,不語.
下一次醒來,女媧已經不在了.然後...
辰軒突然睜開眼睛,其實他不算是睡著,只是配合一下閉上眼躺下而已.
林守文讓他先住在他家,說等她爺爺回來再決定怎麼辦.一整天林守文和苗煜把現在世間的情況講解給他聽,
又改變了,他忍不住想著.
人類的世界變化太快,他認識的朋友總是很快的一個一個離開,他其實很害怕失去,只是他不得不放手,這是自然的規則.

第二天辰軒想把睡得很死的林守文推起來,努力了很久無果,苗煜就推門進來了.
[你這樣是叫不起來的.]
苗煜俊秀的臉上帶起了微微的笑,猛然發力,一腳狠狠的踹在林守文的屁股上.
[你怎麼又這樣叫我…很痛欸!]
苗煜拿起了床邊小紫幫守文準備好的衣服,甩手一丟到了守文頭上,拉著辰辰走向餐廳.
[你快一點.]
在林守文又打算躺回去的時候,苗煜又道.
[十分鐘之內沒出來,你就沒有早餐了哦!]
林守文躺到一半的身體踫了起來.
[苗苗小氣鬼!]

又是個歡樂的一天.小紫在廚房偷偷想著.

鬼屋-引

女人站在病床旁,歇斯底里地對著一個六七歲的男孩大吼,甚至憤怒地想動手打他,旁邊椅子上坐著的男人,看著嚇到哭不出來的男孩,眼神冷漠,只有目光看向病床的時候,才有一絲絲溫度,不過病床上的孩子,再也無法回應他了.
[為什麼你不救他?為什麼你不乾脆跟他一起死掉?]
[你是哥哥啊!為什麼不救你弟弟?你怎麼可以這麼自私?]
[連救自己弟弟都做不到,多希望沒生過你這個廢物.]
種種尖銳刺耳的話環繞在男孩小小的腦袋裡,像個氣球擴張膨大,把他逼得喘不過氣.
不是他的錯,卻因為他活著,所以讓他來承受.
或許那時候我死掉比較好.男孩突然想道.
淚水在眼眶裡不再凝結,已經無法再做思考,他並不是沒有受傷,只是不嚴重,但是在承受謾罵之後,幼小的身體還是受不住昏了過去.
昏迷前,看到一個老人推開門衝了進來,在自己倒下的剎那抱住自己,好像又跟女人吵了起來.

爺爺,媽媽是不是,不要我了?

此生負心只一人

“此生負心只一人”
原著:沉病嬌
作詞:五子

昨日梨花今成雪 故人死離別
執子重落湖心月 對弈問誰解

曾聞去年有舊約 一字也泣血
十一畫難托鴻雁 此去音塵絕

見風流成恨意黃昏 此生負心只一人
城下一夜紅蓮 若沉悶 再賜我刀俎加身

見昨日君臣今日宮門 此生負心只一人
忽白雪紛紛 花藏何處 留一縷香成恨

朝憶梨花暮憶雪 枯枝還未謝
執子重落湖心月 一招抵心結

曾聞去年有舊約 得失莫問詰
十一畫難托鴻雁 只雲皆我願


[洪諺,你…後悔嗎?]
[臣,無悔.]

你我初遇,那時我還未為帝王,你亦非權臣.
年少輕狂,我們如膠似漆.
但最終我娶了妻.你離了京.
我必須做我的太子,你只能做你的將軍.
我們似乎必須錯過.
而後,我踏上王位,你選擇排除異己,站在了我的身邊.
[皇上,臣…還能…]
[不能,下去吧.]
[…是.]
我以為那就是我們的結局.

或許,或許應該…
[皇上,該用膳了.]
帝王如夢初醒,向唐總管招招手.
[下去,朕不餓.]
[皇上,您已經兩餐未用了…]
[不必再勸.]
[…是]
唐總管擔心地看著分神的帝王,卻也不敢再勸.若是那人沒有…唐總管搖搖頭.反正一切也都來不及了.
[唐傭.]
李清瀾突然喚了一聲,唐總管連忙應聲.
[那人…洪諺現於何處?]
[大獄三層.]
李清瀾站了起來.
[隨朕出宮.]
唐傭大驚,忙道.
[皇上!那種汙穢之地,您怎能…]
無視唐傭的勸阻,李清瀾逕自走了出去,唐傭有只能跟上.
[備駕!]

踩過滿是血垢的地板,李清瀾忍著噁心的感覺,緩緩地走向最下層的監獄.
他就在那裏…
隔著柵門,李清瀾望著裡面那個被綁在柱子上的人.
揮揮手,讓人拿來了鑰匙,猶疑的唐傭雖不願但還是往後站了站.
李清瀾開了柵門,站在那人前面.
[你們對他用刑了?]
獄卒愣了一下道.
[回皇上,沒有用刑,只是,沒有送飯.]
李清瀾震怒的把手上的鑰匙丟到獄卒身上.
[誰準你們這樣對他的?]
獄卒噗通一聲跪下連聲求饒.在李清瀾讓他滾的時候,連爬帶滾的往上層爬,深怕慢了一步就掉了腦袋.
興許是聽到聲音,洪諺緩緩地抬起頭,虛弱的笑道.
[清瀾,別怪他了,犯人待遇本就不會太好的,更何況…咳…我]
[洪諺,你怎能直呼皇上名諱!這是犯上!]
唐傭截斷了洪諺的話尖聲道.
[他本就是叛亂的罪名,還怕這犯上?唐傭,你也上去.]
[皇上!]
唐傭真心不希望皇上與洪諺待在一起.
[上去!]
[…是.]
待唐傭上樓後,李清瀾望著洪諺,洪諺道.
[清瀾,讓我這樣喚你好嗎?或許之後,再也沒有機會了…]
原本俊美的臉龐已經憔悴的不成樣子,但在李清瀾眼裡,他還是那個才氣四溢的洪諺.
[為什麼?]
李清瀾冷聲道.
[你明明已是萬人之上,為什麼…要反我?]
洪諺搖搖頭,眼裡盡是無法言道的溫柔.
[並非反你,我只是…希望你自由.]
李清瀾愣愣地不說話.洪諺喘口氣又道.
[你上位後,從來沒有真的笑過了…]
[你胡說!]
[清瀾…每次看你冷笑我就想抱著你,想告訴你你還有我.還記得嗎?你曾說你想與我一同浪跡天涯…]
[那不過是想想罷了!你…]
[我想要讓它變成真的!清瀾,我不後悔叛變,我只後悔我沒有成功,沒能帶你走.]
李清瀾突然抱著洪諺,不顧髒污,緊緊地抓著,就像一放手就會失去.
[我寧願不要自由,我只要你活著.]
[對不起…我愛你…]
洪諺輕聲道.
李清瀾終是忍不住眼淚.

你若離去,這天下還有什麼值得留戀.

延龍十三年初,叛臣洪諺問斬.
同年十月,皇帝積勞成疾奏逝,太子即位.

-------------------------------------------------------------------------------------------------------------------------

喜歡這首歌~~
https://www.youtube.com/watch?v=GKW6536fI1k
然後
就有了動筆的念頭了哈哈
明明超不會寫古代的...
不小心也有一千多字
如果我報告寫得出那麼多就好惹(๑•́ ₃ •̀๑)

2016年8月31日 星期三

textBox打字時可出現輔助查詢單字的一小部分程式碼

同學要做
像是打AA BB CC
文字游標在CC之後
按ctrl+A把DatagridView顯示在文字游標旁
DatagridView會顯示資料庫裡開頭是CC的值(假設是CCDD
然後選擇CCDD後
會取代掉CC
變成AA BB CCDD
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
我幫忙的部分沒有資料庫那一塊
所以就是
像是打AA BB CC
文字游標在CC之後
按ctrl+A把DatagridView顯示在文字游標旁
然後有兩種
1.
同學做的是用取代的方式
按DatagridView會把CC取代成我要的(假設是CCDD)
小問題是如果前面也有CC
如AA BB CC AA CC
我只要取代後面的CC但是前面的也會一起被取代
變成AA BB CCDD AA CCDD
2.
我做的放在Button
用 刪除字(空白後());插入字串();
也可以把CC取代成我要的
但是小問題是換行不算空白
所以會連前一行的最後一個字串一起刪掉


------------------------------------------------------------------------------------------------------------------------------------
        string cmdText, insertText, txt;
        string[] stringArray;
        int txt1;
        Point p, P;
        private void textBox1_KeyDown(object sender, KeyEventArgs e)//按ctrl+A把DatagridView顯示在文字游標旁
        {
            if (e.KeyCode == Keys.A && e.Control == true)
            {
                if (e.KeyCode == Keys.A)
                {
                    p = GetCursorPos(this.textBox1.Handle.ToInt32());
                    this.label1.Text = string.Format("Line:{0}, Col:{1}", p.X, p.Y);
                    P.X = (p.Y) * (int)textBox1.Font.Size + textBox1.Location.X ;
                    P.Y = (p.X+1) * (int)textBox1.Font.Size + textBox1.Location.Y;
                    dataGridView1.Location = P;
                    dataGridView1.Show();
                    //抓空白
                    stringArray = textBox1.Text.Split(' ', '\n');
                    //抓陣列最後一個字串
                    txt = stringArray[stringArray.Length - 1];
                }
            }
        }
        //
        #region 游標在第幾行第幾個
        const int EM_GETSEL = 0xB0;
        const int EM_LINEFROMCHAR = 0xC9;
        const int EM_LINEINDEX = 0xBB;
        [DllImport("user32.dll", EntryPoint = "SendMessage")]
        public static extern int SendMessage( int hwnd, int wMsg,int wParam,ref int lParam );
     
        public Point GetCursorPos(int TextHwnd)
        {
            int i = 0, j = 0, k = 0;
            int lParam = 0, wParam = 0;
            i = SendMessage(TextHwnd, EM_GETSEL, wParam, ref lParam);
            j = i / 65536;
            int lineNo = SendMessage(TextHwnd, EM_LINEFROMCHAR, j, ref lParam) + 1;
            k = SendMessage(TextHwnd, EM_LINEINDEX, -1, ref lParam);
            int colNo = j - k + 1;
            Point ret = new Point(lineNo, colNo);
            return ret;
        }
        #endregion
        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            //將選取內容插入鼠標位置
            string insertText = "選取內容";
            int insertPos = textBox1.SelectionStart;
            //刪除游標所在的陣列
            textBox1.Text = textBox1.Text.Replace(txt, insertText);
            textBox1.SelectionStart = insertPos + insertText.Length;
            //關閉dataGridView
            dataGridView1.Visible = false;
        }
        private void button1_Click(object sender, EventArgs e)//刪除游標前一個字元加入我要的字串
        {
            刪除字(空白後());
            插入字串();
        }
     
        public void 刪除字(int CC)
        {
            int insertPos = textBox1.SelectionStart;
            char[] c = textBox1.Text.ToCharArray();
            textBox1.Text = "";
            for(int y=0;y< CC;y++)
            c[insertPos - 1-y] = ' ';
            for (int i = 0; i < c.Length; i++)
            {
                bool BB = true;
                for (int y = 0; y < CC; y++)
                    if (i == insertPos - 1 - y)
                    {
                        BB = false;
                        break;
                    }
                if (BB)
                    textBox1.Text += c[i];
            }
             
        }
        public int 空白後()
        {
            int CC = 0;
            int insertPos = textBox1.SelectionStart;
            insertPos--;
            char[] c = textBox1.Text.ToCharArray();
            while(c[insertPos--]!=' ')
            {
                CC++;
            }
            return CC;
        }
        public void 插入字串()
        {
            string insertText = "";
            int insertPos = textBox1.SelectionStart;
            textBox1.Text = textBox1.Text.Insert(insertPos, insertText);
            textBox1.SelectionStart = insertPos + insertText.Length;
        }

由txt檔讀取數值繪製波形


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;
namespace HRV_波形
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        float ff;
        List<int> ii = new List<int>();//動態陣列
        private void Form1_Load(object sender, EventArgs e)
        {
            StreamReader sr = new StreamReader(@"E:\raw.txt");
            //===一次讀取全部內容===
            string a = sr.ReadToEnd();
            richTextBox1.Text = a;//顯示在textbox
            sr.Close();
            //
            sr = new StreamReader(@"E:\raw.txt");
            string line;
            List<string> iii = new List<string>();
            while (!sr.EndOfStream)//一次讀一行(一個值)
            {
                line = sr.ReadLine();
                iii.Add(line);
            }
            for (int aaa = 0; aaa < iii.Count; aaa++)//由字串轉成數值
            {
                if (iii[aaa] != "" && iii[aaa] != null)
                    ii.Add(int.Parse(iii[aaa]));
            }
            sr.Close();
            //設定panel大小
            panel2.Width = ii.Count * 2;
            panel2.Height = panel1.Height;
            ff = panel1.Height / 260;
        }
     
        private void panel2_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = panel2.CreateGraphics();
            //
            List<Point> MyPoint = new List<Point>();
            Pen Mypen = new Pen(Color.Blue);
            Point p = new Point();
            for (int b = 0; b < ii.Count; b++)
            {
                int c = ii[b];
                p.X = b;
                p.Y = 250 - c;
                MyPoint.Add(p);
            }
            for (int b = 1; b < MyPoint.Count; b++)
            {
                g.DrawLine(Mypen, MyPoint[b - 1], MyPoint[b]);
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            panel2.Invalidate();//重繪
        }
    }
}

封包解碼

要找出綠色那邊的資料~~

        string s, ss, a;
        char[] line;
        int[,] ll = new int[64, 32];
        private void Form1_Load(object sender, EventArgs e)
        {
           
            System.IO.StreamReader file =new System.IO.StreamReader(@"E:\實習\鈺婷\1.asc", Encoding.ASCII);//匯入檔案
            s = file.ReadToEnd();//讀取檔案到最後
            textBox1.Text = s;
            line = s.ToCharArray();//字串轉成字元陣列
            int x = 0;
            for(int i=0;i<line.Length-1;i++)//一個字一個字識別是不是我要的//取得8=XX後的32byte資料
            {
                ss = line[i].ToString() + line[i+1].ToString();
                if (ss=="8=")
                {
                    //
                    textBox2.Text += line[i].ToString() + line[i + 1].ToString() + line[i + 2].ToString()+ line[i + 3].ToString() + line[i + 4].ToString();//顯示8=XX
                    //找後面32bytes
                    for (int y=0;y<32;y++)
                    {
                        a += line[i + 5 + y].ToString();
                        ll[x,y] = line[i + 5 + y];
                        textBox2.Text += "," + ll[x,y];
                    }
                    x += 1;
                    textBox2.Text += "\r\n";
                    if (x >= 64)//目前是64筆資料
                        break;
                    //
                }
            }
           
        }

用藍芽收發文件

程式碼 :
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;
using InTheHand.Net;
using InTheHand.Net.Sockets;
using System.IO;
using System.Threading;
using InTheHand.Net.Bluetooth;
using System.Net.Sockets;
using InTheHand.Windows.Forms;
//using System.Diagnostics;
using Brecham.Obex;
using Brecham.Obex.Objects;
using System.Net;
//using DragAndDropFileControlLibrary;//托放作品

namespace Ex1
{
    public partial class Form1 : Form
    {
        
        //BluetoothClient client;
        //Stack<ListViewItem[]> previousItemsStack = new Stack<ListViewItem[]>();
        //ObexClientSession session;
        //string localAds;
        //BluetoothAddress mac = null;//地址
        //BluetoothEndPoint localEndpoint = null;//送出端
        //BluetoothClient localClient = null;//接收端
        //BluetoothComponent localComponent = null;
        BluetoothRadio radio = null;//蓝牙适配器  
        string sendFileName = null;//发送文件名  
        BluetoothAddress sendAddress = null;//发送目的地址  
        ObexListener listener = null;//监听器  
        string recDir = null;//接受文件存放目录  
        Thread listenThread, sendThread;//发送/接收线程  
        public Form1()
        {
            InitializeComponent();
            
            radio = BluetoothRadio.PrimaryRadio;//获取当前PC的蓝牙适配器  
        }

       
        private void Connect()
        {
            
            using (SelectBluetoothDeviceDialog bldialog = new SelectBluetoothDeviceDialog())// SelectBluetoothDeviceDialog是一个InTheHand.Net.Personal提供的窗体,用于选择蓝牙设备
            {
                if (bldialog.ShowDialog() == DialogResult.OK)
                {
                    sendAddress = bldialog.SelectedDevice.DeviceAddress;//获取选择的远程蓝牙地址  
                    label2.Text = "地址:" + sendAddress.ToString() + "    設備名:" + bldialog.SelectedDevice.DeviceName;
                }  
            }
        }
        private void sendFile()//发送文件方法  
        {
            ObexWebRequest request = new ObexWebRequest(sendAddress, Path.GetFileName(sendFileName));//创建网络请求  
            WebResponse response = null;
            try
            {
                button發送.Enabled = false;
                request.ReadFile(sendFileName);//发送文件  
                label發送狀態.Text = "開始發送!";
                response = request.GetResponse();//获取回应  
                label發送狀態.Text = "發送完成!";
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("發送失敗!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                label發送狀態.Text = "發送失敗!";
            }
            finally
            {
                if (response != null)
                {
                    response.Close();
                    button發送.Enabled = true;
                }
            }
        }  
        private void buttonListen_Click(object sender, EventArgs e)//开始/停止监听  
        {
            if (listener == null || !listener.IsListening)
            {
                radio.Mode = RadioMode.Discoverable;//设置本地蓝牙可被检测  
                listener = new ObexListener(ObexTransport.Bluetooth);//创建监听  
                listener.Start();
                if (listener.IsListening)
                {
                    buttonListen.Text = "停止";
                    label1.Text = "開始監聽";
                    listenThread = new Thread(receiveFile);//开启监听线程  
                    listenThread.Start();
                }
            }
            else
            {
                listener.Stop();
                buttonListen.Text = "監聽";
                label1.Text = "停止監聽";
            }
        }
        private void receiveFile()//收文件方法  
        {
            ObexListenerContext context = null;
            ObexListenerRequest request = null;
            while (listener.IsListening)
            {
                context = listener.GetContext();//获取监听上下文  
                if (context == null)
                {
                    break;
                }
                request = context.Request;//获取请求  
                string uriString = Uri.UnescapeDataString(request.RawUrl);//将uri转换成字符串  
                string recFileName = recDir + uriString;
                request.WriteFile(recFileName);//接收文件  
               
            }
        }  
        private void button1_Click(object sender, EventArgs e)//連接藍芽
        {
            Connect();
        }
        private void button選擇文件_Click(object sender, EventArgs e)
        {
            OpenFileDialog opp=new OpenFileDialog();
            if (opp.ShowDialog() == DialogResult.OK)
            {
                sendFileName = opp.FileName;
                label發送文件名.Text = "文件:" + sendFileName;
            }
        }
        private void button發送_Click(object sender, EventArgs e)
        {
            sendFile();
        }
        private void button選擇目錄_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog opd = new FolderBrowserDialog();
            opd.Description = "请选择蓝牙接收文件的存放路径";
            if (opd.ShowDialog() == DialogResult.OK)
            {
                recDir = opd.SelectedPath;
                label接收目錄.Text = recDir;
            }  
        }

    }
}
 

之前玩藍芽器材的時候做練習的
痾這好像是度娘的資源哈哈
總之程式設計就是一種練習找資料的事情厄

筆電攝像鏡頭運用+臉部偵測_emguCV

本來要學學姊做的範例
因為學姊範例不知道是版本問題還是怎
不能複製貼上
所以又參考了估狗大神
我總共試做了7個
有兩個是失敗的
camera01 可攝影
camera02 失敗
使用VS內emgu套件 無法使用
camera03 可攝影 可截圖 可存檔
camera04 失敗
camera05 照片可找臉
camera06 攝影截圖可找臉
camera07 可攝影同時找臉

重要步驟:
1.使用自己安裝的emgu(emgucv-windows-universal 3.0.0.2157)  (之後再試著直接用visualstudio的套件,目前使用套件emguCV是失敗的)
2.更改 專案名稱右鍵->屬性->建置->平台 改為x64
3.增加參考(前三個那個

camera01 可攝影 
設計頁面:
程式碼:
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;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.Util;
namespace camera01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private Capture _capture;
        private bool _captureInProgress;
        int i = 0;
        private void ProcessFrame(object sender, EventArgs arg)
        {
            Mat frame= _capture.QueryFrame();
            //Image<Bgr, Byte> frame = _capture.QueryFrame();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            #region if capture is not created, create it now
            if (_capture == null)
            {
                try
                {
                    _capture = new Capture();
                }
                catch (NullReferenceException excpt)
                {
                    MessageBox.Show(excpt.Message);
                }
            }
            #endregion
            if (_capture != null)
            {
                if (_captureInProgress)
                {  //stop the capture                  
                    Application.Idle -= new EventHandler(ProcessFrame);
                    button1.Text = "Start Capture";
                    timer1.Enabled = false;
                }
                else
                {
                    //start the capture                  
                    button1.Text = "Stop";
                    Application.Idle += new EventHandler(ProcessFrame);
                    timer1.Enabled = true;
                }
                _captureInProgress = !_captureInProgress;
            }
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            pictureBox1.Image = _capture.QueryFrame().Bitmap;
        }
    }
}

camera03 可攝影 可截圖 可存檔
設計頁面:

程式碼 :
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;
using Emgu.CV;
using Emgu.CV.Structure;
namespace camera03
{
    public partial class Form1 : Form
    {
        public Capture cap;
        private bool capInProgress;
        int i = 0;
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox2.Left = pictureBox1.Width + 40;
        }
        private void ProcessFrame(object sender, EventArgs arg)
        {
            pictureBox1.Image = cap.QueryFrame().Bitmap;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            #region if capture is not created, create it now
            if (cap == null)
            {
                try
                {
                    cap = new Capture();
                }
                catch (NullReferenceException excpt)
                {
                    MessageBox.Show(excpt.Message);
                }
            }
            #endregion
            if (cap != null)
            {
                pictureBox1.Size = cap.QueryFrame().Bitmap.Size;
                pictureBox2.Left = pictureBox1.Width + 40;
                if (capInProgress)
                {  //stop the capture                  
                    Application.Idle -= new EventHandler(ProcessFrame);
                    button1.Text = "開始攝像";
                   
                    //timer1.Enabled = false;
                }
                else
                {
                    //start the capture                  
                    button1.Text = "停止";
                    Application.Idle += new EventHandler(ProcessFrame);
                    //timer1.Enabled = true;
                }
                capInProgress = !capInProgress;
            }
        }
       
        private void button2_Click(object sender, EventArgs e)
        {
            pictureBox2.Size = pictureBox1.Size;
            pictureBox2.Image= cap.QueryFrame().Bitmap;
        }
        private void button3_Click(object sender, EventArgs e)
        {
            string name = DateTime.Now.ToString("yyyy-MM-dd tt hh-mm-ss") ;
            try
            {
                //SaveFileDialog saveFileDialog1 = new SaveFileDialog();
                saveFileDialog1.Filter = "Bitmap Image|*.bmp";
                saveFileDialog1.FileName = name;
                saveFileDialog1.Title = "儲存圖片";
                saveFileDialog1.ShowDialog();
                if (saveFileDialog1.FileName != "")
                {
                    System.IO.FileStream fs = (System.IO.FileStream)saveFileDialog1.OpenFile();
                    switch (saveFileDialog1.FilterIndex)
                    {
                        case 1:
                            this.pictureBox1.Image.Save(fs,
                                      System.Drawing.Imaging.ImageFormat.Bmp);
                            break;
                    }
                    fs.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

camera05 照片可找臉
設計頁面 :
程式碼 :
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;
using System.IO;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.UI;
using Emgu.CV.Structure;
using Emgu.Util;
using Emgu.CV.ML;
using Emgu.CV.Cuda;

namespace camera05
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox1.ImageLocation = "../01.jpg";
            //pictureBox1.Size = pictureBox1.Image.Size;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Application.EnableVisualStyles();
            //Application.SetCompatibleTextRenderingDefault(false);
            Run(ref pictureBox1);
        }
     
        static void Run(ref PictureBox p)
        {
            Mat image = new Mat("../02.jpg", LoadImageType.Color); //Read the files as an 8-bit Bgr image
            long detectionTime;
            List<Rectangle> faces = new List<Rectangle>();
            List<Rectangle> eyes = new List<Rectangle>();
            //The cuda cascade classifier doesn't seem to be able to load "haarcascade_frontalface_default.xml" file in this release
            //disabling CUDA module for now
            bool tryUseCuda = false;
            bool tryUseOpenCL = true;
            Detect(
              image, "../haarcascade_frontalface_default.xml", "../haarcascade_eye.xml",
              faces, eyes,
              tryUseCuda,
              tryUseOpenCL,
              out detectionTime);
            foreach (Rectangle face in faces)
                CvInvoke.Rectangle(image, face, new Bgr(Color.Red).MCvScalar, 2);
            //foreach (Rectangle eye in eyes)
            //    CvInvoke.Rectangle(image, eye, new Bgr(Color.Blue).MCvScalar, 2);
            //display the image
            p.Image = image.Bitmap;
            
        }
        public static void Detect(Mat image, String faceFileName, String eyeFileName, List<Rectangle> faces,
           List<Rectangle> eyes, bool tryUseCuda, bool tryUseOpenCL, out long detectionTime)
        {
            Stopwatch watch;
#if !(IOS || NETFX_CORE)
            if (tryUseCuda && CudaInvoke.HasCuda)
            {
                using (CudaCascadeClassifier face = new CudaCascadeClassifier(faceFileName))
                using (CudaCascadeClassifier eye = new CudaCascadeClassifier(eyeFileName))
                {
                    face.ScaleFactor = 1.1;
                    face.MinNeighbors = 10;
                    face.MinObjectSize = Size.Empty;
                    eye.ScaleFactor = 1.1;
                    eye.MinNeighbors = 10;
                    eye.MinObjectSize = Size.Empty;
                    watch = Stopwatch.StartNew();
                    using (CudaImage<Bgr, Byte> gpuImage = new CudaImage<Bgr, byte>(image))
                    using (CudaImage<Gray, Byte> gpuGray = gpuImage.Convert<Gray, Byte>())
                    using (GpuMat region = new GpuMat())
                    {
                        face.DetectMultiScale(gpuGray, region);
                        Rectangle[] faceRegion = face.Convert(region);
                        faces.AddRange(faceRegion);
                        foreach (Rectangle f in faceRegion)
                        {
                            using (CudaImage<Gray, Byte> faceImg = gpuGray.GetSubRect(f))
                            {
                                //For some reason a clone is required.
                                //Might be a bug of CudaCascadeClassifier in opencv
                                using (CudaImage<Gray, Byte> clone = faceImg.Clone(null))
                                using (GpuMat eyeRegionMat = new GpuMat())
                                {
                                    eye.DetectMultiScale(clone, eyeRegionMat);
                                    Rectangle[] eyeRegion = eye.Convert(eyeRegionMat);
                                    foreach (Rectangle e in eyeRegion)
                                    {
                                        Rectangle eyeRect = e;
                                        eyeRect.Offset(f.X, f.Y);
                                        eyes.Add(eyeRect);
                                    }
                                }
                            }
                        }
                    }
                    watch.Stop();
                }
            }
            else
#endif
            {
                //Many opencl functions require opencl compatible gpu devices.
                //As of opencv 3.0-alpha, opencv will crash if opencl is enable and only opencv compatible cpu device is presented
                //So we need to call CvInvoke.HaveOpenCLCompatibleGpuDevice instead of CvInvoke.HaveOpenCL (which also returns true on a system that only have cpu opencl devices).
                CvInvoke.UseOpenCL = tryUseOpenCL && CvInvoke.HaveOpenCLCompatibleGpuDevice;

                //Read the HaarCascade objects
                using (CascadeClassifier face = new CascadeClassifier(faceFileName))
                using (CascadeClassifier eye = new CascadeClassifier(eyeFileName))
                {
                    watch = Stopwatch.StartNew();
                    using (UMat ugray = new UMat())
                    {
                        CvInvoke.CvtColor(image, ugray, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);
                        //normalizes brightness and increases contrast of the image
                        CvInvoke.EqualizeHist(ugray, ugray);
                        //Detect the faces  from the gray scale image and store the locations as rectangle
                        //The first dimensional is the channel
                        //The second dimension is the index of the rectangle in the specific channel
                        Rectangle[] facesDetected = face.DetectMultiScale(
                           ugray,
                           1.1,
                           10,
                           new Size(20, 20));
                        faces.AddRange(facesDetected);
                        foreach (Rectangle f in facesDetected)
                        {
                            //Get the region of interest on the faces
                            using (UMat faceRegion = new UMat(ugray, f))
                            {
                                Rectangle[] eyesDetected = eye.DetectMultiScale(
                                   faceRegion,
                                   1.1,
                                   10,
                                   new Size(20, 20));
                                foreach (Rectangle e in eyesDetected)
                                {
                                    Rectangle eyeRect = e;
                                    eyeRect.Offset(f.X, f.Y);
                                    eyes.Add(eyeRect);
                                }
                            }
                        }
                    }
                    watch.Stop();
                }
            }
            detectionTime = watch.ElapsedMilliseconds;
        }
    }
}

camera06 攝影截圖可找臉
設計頁面:
程式碼 :
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;
using System.IO;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.UI;
using Emgu.CV.Structure;
using Emgu.Util;
using Emgu.CV.ML;
using Emgu.CV.Cuda;
namespace camera06
{
    public partial class camera06 : Form
    {
        public Capture cap;
        private bool capInProgress;
        Mat mat_face;
        public camera06()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
        }
       
        private void btn攝影_Click(object sender, EventArgs e)
        {
            #region if capture is not created, create it now
            if (cap == null)
            {
                try
                {
                    cap = new Capture();
                }
                catch (NullReferenceException excpt)
                {
                    MessageBox.Show(excpt.Message);
                }
            }
            #endregion
            if (cap != null)
            {
                if (capInProgress)
                {  //stop the capture                  
                    Application.Idle -= new EventHandler(ProcessFrame);
                    btn攝影.Text = "開始攝像";
                    //timer1.Enabled = false;
                }
                else
                {
                    //start the capture                  
                    btn攝影.Text = "停止";
                    Application.Idle += new EventHandler(ProcessFrame);
                    //timer1.Enabled = true;
                }
                capInProgress = !capInProgress;
            }
        }
        private void ProcessFrame(object sender, EventArgs arg)
        {
            pictureBox1.Image = cap.QueryFrame().Bitmap;
        }
        private void btn截圖_Click(object sender, EventArgs e)
        {
            pictureBox2.Image = cap.QueryFrame().Bitmap;
            mat_face= cap.QueryFrame();
        }
        private void btn找臉_Click(object sender, EventArgs e)
        {
            Run(ref mat_face);
            pictureBox2.Image = mat_face.Bitmap;
        }
        static void Run(ref Mat mat_f)
        {
            Mat image = mat_f; //Read the files as an 8-bit Bgr image
            long detectionTime;
            List<Rectangle> faces = new List<Rectangle>();
            List<Rectangle> eyes = new List<Rectangle>();
            //The cuda cascade classifier doesn't seem to be able to load "haarcascade_frontalface_default.xml" file in this release
            //disabling CUDA module for now
            bool tryUseCuda = false;
            bool tryUseOpenCL = true;
            Detect(
              image, "../haarcascade_frontalface_default.xml", "../haarcascade_eye.xml",
              faces, eyes,
              tryUseCuda,
              tryUseOpenCL,
              out detectionTime);
            foreach (Rectangle face in faces)
                CvInvoke.Rectangle(image, face, new Bgr(Color.Red).MCvScalar, 2);
            //foreach (Rectangle eye in eyes)
            //    CvInvoke.Rectangle(image, eye, new Bgr(Color.Blue).MCvScalar, 2);
            //display the image
            mat_f = image;
        }
        public static void Detect(Mat image, String faceFileName, String eyeFileName, List<Rectangle> faces,
           List<Rectangle> eyes, bool tryUseCuda, bool tryUseOpenCL, out long detectionTime)
        {
            Stopwatch watch;
#if !(IOS || NETFX_CORE)
            if (tryUseCuda && CudaInvoke.HasCuda)
            {
                using (CudaCascadeClassifier face = new CudaCascadeClassifier(faceFileName))
                using (CudaCascadeClassifier eye = new CudaCascadeClassifier(eyeFileName))
                {
                    face.ScaleFactor = 1.1;
                    face.MinNeighbors = 10;
                    face.MinObjectSize = Size.Empty;
                    eye.ScaleFactor = 1.1;
                    eye.MinNeighbors = 10;
                    eye.MinObjectSize = Size.Empty;
                    watch = Stopwatch.StartNew();
                    using (CudaImage<Bgr, Byte> gpuImage = new CudaImage<Bgr, byte>(image))
                    using (CudaImage<Gray, Byte> gpuGray = gpuImage.Convert<Gray, Byte>())
                    using (GpuMat region = new GpuMat())
                    {
                        face.DetectMultiScale(gpuGray, region);
                        Rectangle[] faceRegion = face.Convert(region);
                        faces.AddRange(faceRegion);
                        foreach (Rectangle f in faceRegion)
                        {
                            using (CudaImage<Gray, Byte> faceImg = gpuGray.GetSubRect(f))
                            {
                                //For some reason a clone is required.
                                //Might be a bug of CudaCascadeClassifier in opencv
                                using (CudaImage<Gray, Byte> clone = faceImg.Clone(null))
                                using (GpuMat eyeRegionMat = new GpuMat())
                                {
                                    eye.DetectMultiScale(clone, eyeRegionMat);
                                    Rectangle[] eyeRegion = eye.Convert(eyeRegionMat);
                                    foreach (Rectangle e in eyeRegion)
                                    {
                                        Rectangle eyeRect = e;
                                        eyeRect.Offset(f.X, f.Y);
                                        eyes.Add(eyeRect);
                                    }
                                }
                            }
                        }
                    }
                    watch.Stop();
                }
            }
            else
#endif
            {
                //Many opencl functions require opencl compatible gpu devices.
                //As of opencv 3.0-alpha, opencv will crash if opencl is enable and only opencv compatible cpu device is presented
                //So we need to call CvInvoke.HaveOpenCLCompatibleGpuDevice instead of CvInvoke.HaveOpenCL (which also returns true on a system that only have cpu opencl devices).
                CvInvoke.UseOpenCL = tryUseOpenCL && CvInvoke.HaveOpenCLCompatibleGpuDevice;

                //Read the HaarCascade objects
                using (CascadeClassifier face = new CascadeClassifier(faceFileName))
                using (CascadeClassifier eye = new CascadeClassifier(eyeFileName))
                {
                    watch = Stopwatch.StartNew();
                    using (UMat ugray = new UMat())
                    {
                        CvInvoke.CvtColor(image, ugray, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);
                        //normalizes brightness and increases contrast of the image
                        CvInvoke.EqualizeHist(ugray, ugray);
                        //Detect the faces  from the gray scale image and store the locations as rectangle
                        //The first dimensional is the channel
                        //The second dimension is the index of the rectangle in the specific channel
                        Rectangle[] facesDetected = face.DetectMultiScale(
                           ugray,
                           1.1,
                           10,
                           new Size(20, 20));
                        faces.AddRange(facesDetected);
                        foreach (Rectangle f in facesDetected)
                        {
                            //Get the region of interest on the faces
                            using (UMat faceRegion = new UMat(ugray, f))
                            {
                                Rectangle[] eyesDetected = eye.DetectMultiScale(
                                   faceRegion,
                                   1.1,
                                   10,
                                   new Size(20, 20));
                                foreach (Rectangle e in eyesDetected)
                                {
                                    Rectangle eyeRect = e;
                                    eyeRect.Offset(f.X, f.Y);
                                    eyes.Add(eyeRect);
                                }
                            }
                        }
                    }
                    watch.Stop();
                }
            }
            detectionTime = watch.ElapsedMilliseconds;
        }
    }
}

camera07 可攝影同時找臉
設計頁面:
程式碼 :
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;
using System.IO;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.UI;
using Emgu.CV.Structure;
using Emgu.Util;
using Emgu.CV.ML;
using Emgu.CV.Cuda;
namespace camera07
{
    public partial class Form1 : Form
    {
        public Capture cap;
        private bool capInProgress;
        Mat _mat;
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
        }
        private void btn攝像_Click(object sender, EventArgs e)
        {
            #region if capture is not created, create it now
            if (cap == null)
            {
                try
                {
                    cap = new Capture();
                }
                catch (NullReferenceException excpt)
                {
                    MessageBox.Show(excpt.Message);
                }
            }
            #endregion

            if (cap != null)
            {
                if (capInProgress)
                {  //stop the capture                  
                    Application.Idle -= new EventHandler(ProcessFrame);
                    btn攝像.Text = "開始攝像";
                }
                else
                {
                    //start the capture                  
                    btn攝像.Text = "停止";
                    Application.Idle += new EventHandler(ProcessFrame);
                }
                capInProgress = !capInProgress;
            }
        }
        private void ProcessFrame(object sender, EventArgs arg)
        {
            //pictureBox1.Image = cap.QueryFrame().Bitmap;
            _mat = cap.QueryFrame();
            Run(ref _mat);
            pictureBox1.Image = _mat.Bitmap;
        }
        static void Run(ref Mat mat_f)
        {
            Mat image = mat_f; //Read the files as an 8-bit Bgr image
            long detectionTime;
            List<Rectangle> faces = new List<Rectangle>();
            List<Rectangle> eyes = new List<Rectangle>();
            //The cuda cascade classifier doesn't seem to be able to load "haarcascade_frontalface_default.xml" file in this release
            //disabling CUDA module for now
            bool tryUseCuda = false;
            bool tryUseOpenCL = true;
            Detect(
              image, "../haarcascade_frontalface_default.xml", "../haarcascade_eye.xml",
              faces, eyes,
              tryUseCuda,
              tryUseOpenCL,
              out detectionTime);
            //臉
            foreach (Rectangle face in faces)
                CvInvoke.Rectangle(image, face, new Bgr(Color.Red).MCvScalar, 2);
            //眼睛
            //foreach (Rectangle eye in eyes)
            //    CvInvoke.Rectangle(image, eye, new Bgr(Color.Blue).MCvScalar, 2);
            //display the image
            mat_f = image;
        }
        public static void Detect(Mat image, String faceFileName, String eyeFileName, List<Rectangle> faces,
           List<Rectangle> eyes, bool tryUseCuda, bool tryUseOpenCL, out long detectionTime)
        {
            Stopwatch watch;
#if !(IOS || NETFX_CORE)
            if (tryUseCuda && CudaInvoke.HasCuda)
            {
                using (CudaCascadeClassifier face = new CudaCascadeClassifier(faceFileName))
                using (CudaCascadeClassifier eye = new CudaCascadeClassifier(eyeFileName))
                {
                    face.ScaleFactor = 1.1;
                    face.MinNeighbors = 10;
                    face.MinObjectSize = Size.Empty;
                    eye.ScaleFactor = 1.1;
                    eye.MinNeighbors = 10;
                    eye.MinObjectSize = Size.Empty;
                    watch = Stopwatch.StartNew();
                    using (CudaImage<Bgr, Byte> gpuImage = new CudaImage<Bgr, byte>(image))
                    using (CudaImage<Gray, Byte> gpuGray = gpuImage.Convert<Gray, Byte>())
                    using (GpuMat region = new GpuMat())
                    {
                        face.DetectMultiScale(gpuGray, region);
                        Rectangle[] faceRegion = face.Convert(region);
                        faces.AddRange(faceRegion);
                        foreach (Rectangle f in faceRegion)
                        {
                            using (CudaImage<Gray, Byte> faceImg = gpuGray.GetSubRect(f))
                            {
                                //For some reason a clone is required.
                                //Might be a bug of CudaCascadeClassifier in opencv
                                using (CudaImage<Gray, Byte> clone = faceImg.Clone(null))
                                using (GpuMat eyeRegionMat = new GpuMat())
                                {
                                    eye.DetectMultiScale(clone, eyeRegionMat);
                                    Rectangle[] eyeRegion = eye.Convert(eyeRegionMat);
                                    foreach (Rectangle e in eyeRegion)
                                    {
                                        Rectangle eyeRect = e;
                                        eyeRect.Offset(f.X, f.Y);
                                        eyes.Add(eyeRect);
                                    }
                                }
                            }
                        }
                    }
                    watch.Stop();
                }
            }
            else
#endif
            {
                //Many opencl functions require opencl compatible gpu devices.
                //As of opencv 3.0-alpha, opencv will crash if opencl is enable and only opencv compatible cpu device is presented
                //So we need to call CvInvoke.HaveOpenCLCompatibleGpuDevice instead of CvInvoke.HaveOpenCL (which also returns true on a system that only have cpu opencl devices).
                CvInvoke.UseOpenCL = tryUseOpenCL && CvInvoke.HaveOpenCLCompatibleGpuDevice;

                //Read the HaarCascade objects
                using (CascadeClassifier face = new CascadeClassifier(faceFileName))
                using (CascadeClassifier eye = new CascadeClassifier(eyeFileName))
                {
                    watch = Stopwatch.StartNew();
                    using (UMat ugray = new UMat())
                    {
                        CvInvoke.CvtColor(image, ugray, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);
                        //normalizes brightness and increases contrast of the image
                        CvInvoke.EqualizeHist(ugray, ugray);
                        //Detect the faces  from the gray scale image and store the locations as rectangle
                        //The first dimensional is the channel
                        //The second dimension is the index of the rectangle in the specific channel
                        Rectangle[] facesDetected = face.DetectMultiScale(
                           ugray,
                           1.1,
                           10,
                           new Size(20, 20));
                        faces.AddRange(facesDetected);
                        foreach (Rectangle f in facesDetected)
                        {
                            //Get the region of interest on the faces
                            using (UMat faceRegion = new UMat(ugray, f))
                            {
                                Rectangle[] eyesDetected = eye.DetectMultiScale(
                                   faceRegion,
                                   1.1,
                                   10,
                                   new Size(20, 20));
                                foreach (Rectangle e in eyesDetected)
                                {
                                    Rectangle eyeRect = e;
                                    eyeRect.Offset(f.X, f.Y);
                                    eyes.Add(eyeRect);
                                }
                            }
                        }
                    }
                    watch.Stop();
                }
            }
            detectionTime = watch.ElapsedMilliseconds;
        }
    }
}

因為是寒假寫的程式
現在匆匆整理出來還有很多步驟不足
之後再補充囉