2008年9月17日星期三

Jquery Event 的 氣泡事件

我記得之前有看過書就是

<html>

<div>

<span>

<p>xxxxxxxxxxxxxxx</p>

</span>

</div>

</html>

 

如果我寫了一個事件

$(“p”).click(function(){ alert(‘hi’); });

點選會出現 hi ,這是當然的…

但是如果我也寫了一個

$(document.body).click(function(){alert(“you click my body”);});

在body的地方點了會出現 you click my body 是當然的…

但是你在點選 p 的部份時,他會出現 hi , 接著出現 you click my body …

也就是你的事件觸發會像氣泡一樣一層一層的送上去…

後來我在寫類似無名名片,移過去會顯示名片,接著移開會消失,但是一到名片上要依然保持名片顯示,直到移動到body才會隱藏

所以這樣的話造成 mouseover 會觸發到 document.body 的隱藏功能…

後來找了一下jquery , 一開使用 unblind …不過不太對…

看了一下 Jquery Event Guide , 終於找到解決方式了

http://docs.jquery.com/Events_%28Guide%29

就是 function(e){ e.stopPropagation(); } 

也就是不會將事件傳遞回上一層元件

$(toggleItem).mouseover(function(e){
            e.stopPropagation();
            $(cardItem).css("top",e.pageY);
            $(cardItem).css("left",e.pageX);
            $(cardItem).show();
    });

2008年8月24日星期日

JQuery’s SlideDown (effect)

jquery基本有一個很簡單的效果 effect

$(element).slideDown(“slow”);

大部分都這樣就可以看到效果,這次有個需求就是slideDown後要讓裡面的 textbox on focus!

問題是如果直接寫在下面..

$(element).focus();

會造成同步的問題…他同時slideDown也 onFocus 卻會讓他的focus跑掉…

因此其實slidedown還有一個callback可以使用

 

$(element).slidedown(“slow”,function()

{
   $(element).focus();
});

 

他就會等待slidedown後才執行後面的function ,也就可以正常的定住焦點了!

2008年8月21日星期四

Cookie | jQuery Plugins

Cookie | jQuery Plugins
(可下載上面jquery外掛)

在javascript中要處理cookie 的話需要自己去處理字串連接..
但jquery 中沒有這種東西,但是有人寫了jquery 的外掛...

使用上還挺方便的,大概就是 key/pair 去設定,不然還要自己去解析...會很累

http://www.stilbuero.de/2006/09/17/cookie-plugin-for-jquery/

我想我就不寫介紹了..上面連結寫的很詳細了!

另外剛看了一下,原來 cookie 使不能使用在 localhost 端的..所以在自己電腦內寫的話可能沒辦法進行測試(都需要傳到server內)

2008年8月14日星期四

Jquery Queue的作用

一開始要做一個幻燈片的照片播放..

 

function playNow(items)
{
    document.title  ="";
        $.each(items, function(i,item){
            //$("<img/>").attr("src", item.media.m).appendTo("#sidebar-slide_show img");
            $("#sidebar-slide_show img").fadeIn(5000); //5秒

            $("#sidebar-slide_show img").attr("src", item.media.m);
             $("#sidebar-slide_show .sub_text").text(i +":" + item.title);
              document.title += i + "_";    
            $("#sidebar-slide_show img").fadeOut("slow");
        });
}

 

一開始這樣讓他跑,發現他雖然會跑20次 (json object ,array 20) ,不過照片都是在同一張..

加上了

              document.title += i + "_";   

查看後,原來他在第一時間就把所有內容都走訪過一次了(each()) , 只是動畫的部份 fadeOut 會 排程播放…所以動態效果還是存在的

image 
這是在播放第一張的時候所有數字就串連起來了,就證明了剛說得這件事情

function playNow(items)
{
    document.title  ="";
        $.each(items, function(i,item){
            //$("<img/>").attr("src", item.media.m).appendTo("#sidebar-slide_show img");
            $("#sidebar-slide_show img").fadeIn(5000); //5秒
         
  $("#sidebar-slide_show img").queue(function(){
                $("#sidebar-slide_show img").attr("src", item.media.m);
                $("#sidebar-slide_show .sub_text").text(i +":" + item.title);
                document.title += i + "_";   
                $(this).dequeue();
            });               
            $("#sidebar-slide_show img").fadeOut("slow");
        });
}

後來看了他官方的範例  http://docs.jquery.com/Effects/queue 

於是就把圖片讀取的部份加上了queue佇列讓他更動完資訊才會在 dequeue()  繼續執行下面的code ..

如此就可避免資料讀太快,都只會讀到最後一張的問題…

image

 

因為這就變成了timeline的東西 , 必須前面值行完畢才會繼續執行下面程式

譬如….

從遠端讀一張圖後才把DIV往右邊移動…如果沒有做好同步的話,可能在圖片還沒讀完,他就開始移動了

1.讀圖  -> 2.移動圖片div

總之 queue 就是在做這種效果用的,如果希望他在中間停止播放,可以使用 $().stop();

 

以上是剛剛的心得,有問題歡迎來信.

2008年8月7日星期四

動態更換CCS樣板

如果網頁內容是這樣

 

<html>

<head>

<link id=”mycss” src=”stut-csie.css”>

</head>

<body>

……

</body>

</html>

 

接著在script 中利用

 

// JavaScript Document  WITH jquery

$(document.body).ready(function(){

    $("img").click(function(){
        $("#mycss").attr({ href:"css/stut-csie2.css"});

    })
})

 

就可以做到動態更換了!

2008年7月31日星期四

PNG on IE6 的解決方式

最近在做系網

一開始使用png , 由於他優點多…

有些地方div為了讓他很活

<div style=”background-images:url(a.png)">

<img src="2.png"></img>

</div>

就可以讓上面一個透明的logo放在上方

而下方的圖片可以更著替換...

因此隨時可以疊合兩個圖片!!

但是後來用了

IETester 測試..

在IE6下問題很多...

偏偏IE6目前的使用者還是多數!!!(90%以上)

後來在一個網站看到 iepngfix

http://www.twinhelix.com/css/iepngfix/demo/

 

放入一個HTC 檔案來解決

後來看了一下內部是javascript的script 檔案

沒仔細看他的作法是怎樣處理...

剛測試了一下是ok的

(不過據說htc在ie上是一個權限很大的東西,所以在IE7上會看到是禁止的)

image

使用後

image

果然無誤的顯示了!!

使用方法也很簡單

將img , div 加上 behavior:url(iengfix.htc);即可...

2008年7月3日星期四

列舉無名所有相本using Jquery#2

sca

喔…終於寫好了 ,這是我學長帳號的 http://www.wretch.cc/album/scarfighter , 166本

放在 http://userscripts.org/scripts/show/29538 可以下載安裝 (需安裝greasemonkey)

卡在$.get部份好久, 主要是global變數的問題…

for (i…) 的地方…在 subfunction 裡面收不到 i (都等於1)

後來又搞了一個<div id=count> 發現網路會有不同步情況…

也就是說 page 5要去讀這個div value的時候會讀到已經跑到8的問題…

所以後來改用直接抓網頁內文,無名小站最上方會有一個script 紀錄目前頁數

主要是debug時間花了很多….中文版firebug有點失靈…還我英文版阿 XDDD

還有javascript 找不到groups ….後來放棄…,果然regex在javascript有點怪怪的(也可能html code copy來源不對)

然後處理完後把page nubmer list 拿掉 ,就

image

頁碼不見這樣

image

下面是greasemonkey的 source code for firefox3.0 (也沒差)

// ==UserScript==
// @name Wretch Album Expander = OPEN ALBUM
// @namespace http://icoolsblog.blogspot.com
// @description Expand wretch album 2
// @homepage http://icools-csharpblog.blogspot.com/
// @include http://www.wretch.cc/album/

var GM_JQ = document.createElement("script");
GM_JQ.src = "http://code.jquery.com/jquery-latest.min.js"; // for i can change display text on web , or change style

GM_JQ.type = "text/javascript";
document.getElementsByTagName("head")[0].appendChild(GM_JQ);
document.cookie = 'showall=1'; //open page

GM_wait();

function GM_wait()
{
if (typeof unsafeWindow.jQuery == "undefined")
window.setTimeout(GM_wait, 100);
else
{
album_expander(unsafeWindow.jQuery);
}
}

function album_expander($)
{
userName = getUserName();
pageNumber = getPageNumber($);//if pageNubmer =1 then exit
if(location.href== "http://www.wretch.cc/album/" + userName && pageNumber >1 )
{
var loadingHtml = "Loading...";
for(i = pageNumber;i>=2;i--)
{
$("table#ad_square").after("<table id=ad_square"+ i +">"+ loadingHtml +i+"</table>");
// get page 2
$.get("http://www.wretch.cc/album/" + userName + "&page=" + i ,{page:i},function(pageN)
{
var myregexp = /<table\sid="ad_square"[^>]*>([\w\s\S]*)<\/table>[^<]*<\/td><\/tr>/;
var match = myregexp.exec(pageN);
var myregexp2 = /link_hotkey_parameters\['page'\]\s=\s(\d)/;
var match2 = myregexp2.exec(pageN);
mypageNuber = match2[1];
$("table#ad_square"+ mypageNuber).html(match[1]);// insert after
});
}

removePageList($);
}

}

function getUserName()
{
var myregexp = /http:\/\/www.wretch.cc\/album\/([^&]*)&?/;
var match = myregexp.exec(location.href);
return match[1];
}
function getPageNumber($)
{
var myregexp = /(\d)<\/a>[^<]*<a\sid="next"/; // link_hotkey_parameters\['total'\]\s=\s(\d)
var match = myregexp.exec($("body").html()); // match index =0
return match[1];
}

function removePageList($)
{
$("table tbody tr td center font.small-c").html("");
}

列舉無名所有相本using Jquery

喔這不是展開大圖..

而是相本,他本身進入相簿後會自己列出所有縮圖的功能

不過相本的話就沒有提供這個功能

剛剛就用jquery寫了一個greasemonkey

不過對jquery其實摸的不是很熟…

搞了一小時多才弄出來

用到jquery的部份大概有 after (插入元素)、get(取得網頁,一開使用錯load)還有一些selector

先看原本的跟結果好了,剛隨意以 ptmrrbt0116 這個人為測試他有兩頁

[正常]是這樣 
  1

[列舉] 是這樣loading中(網路偷抓了一個很醜的loading gif) 
  2

loading 結束 
  3

等於就把第二頁的table#ad_square資料抓進來然後插入在page1

//判斷是否第一頁

   1:  if(location.href=="http://www.wretch.cc/album/ptmrrbt0116" ) 


   2:      { 


   3:          //產生一個表格放在原本的 table#ad_square下面 


   4:          $("table#ad_square").after("<table id=ad_square2>loading…</table>");        


   5:          //取得到page2網頁,用regex取得table#ad_square 資料 


   6:          $.get("http://www.wretch.cc/album/ptmrrbt0116&page=2", {page:2}, 


   7:              function(pageN) 


   8:              {          


   9:                  var myregexp = /<table\sid="ad_square"[^>]*>([\w\s\S]*)<\/table>[^<]*<\/td><\/tr>/; 


  10:                  var match = myregexp.exec(pageN); 


  11:                  if (match != null && match.length > 1) 


  12:                  {                


  13:                      // 將資料插入 


  14:                      $("table#ad_square2").html(match[1]); 


  15:                  }                


  16:              });        


  17:      }    










code大致就這樣..搞好久..



剛測試所以把網址寫死,等等在改成可以用的



自己筆記一下一些jquery用法




  • after 或者 insertAfter 兩者用法相反(前後順序)


  • $(“talbe”).load(“test.html”) 主要是載入資料用的所以用load去載 page2會讓他出現問題(html問題?)



其他大概沒什麼了..先來改活在丟到greasemonkey

2008年7月2日星期三

Matlab 圖合併

有四張一樣大小的圖要橫著並在一起, how to ?

% NG1 ~3 and RV1 are all the same size image

[h w] = size(NG1(:,:,1));
MPic = zeros(h,w*4,3);
MPic(1:h,1:w,:) =double(NG1);
MPic(1:h,w+1:w*2,:) =double(NG2);
MPic(1:h,w*2+1:w*3,:) =double(NG3);
MPic(1:h,w*3+1:w*4,:) =double(RV1);
MPic= uint8(MPic);
imwrite(MPic,strcat('mg/',fileName,'.png'));

當然應該有現成工具可以使用

懶得查閱了..所以就用這種方法

如果圖片的數量多的話,Mpic 的部份可以用迴圈

譬如:

MPic(1:h,w*i+1:w*(i+1),:) =double(eval(‘RV1’));

2008年6月27日星期五

Desktopr –Flickr Tag 拼桌布

image

偶然看到一個flickr的圖,對方式用手動拼的..

後來找了一下之前寫的…

輸入Tag 就可以替你產生一個桌布~

懶得放 code 上來,貼個圖做紀錄 XDDDD

project name :FlickrThumb

36kb (不過flickrnet.dll 150K)

keyword:FlickrNet 、C# 、desktop、桌布

2008年6月19日星期四

碩博士論文自動點選 (Greasemonkey)

最近在找一些論文

碩博士論文很龜毛就是每次點選一個電子全文

就會跳出是否同意的版權等等等沒人再看的宣告

image

之後會跳出要點選同意

image

接著才有下載頁面

image

真是他媽的麻煩…..

剛寫了一個 greasemonkey

先自動點選 “我同意” 接著取出電子全文中的連結

然後用 locaiton.href =  link ;

script 如下 :

// ==UserScript==
// @name     碩博士論文自動點選下載
// @namespace      icools
// @description    automatic agree system
// @include        https://etds.ncl.edu.tw/theabs/service/say.jsp?FT=Y&id=*
// @include        https://etds.ncl.edu.tw/theabs/service/ft_result.jsp?FT=Y&id=*

// ==/UserScript==

var GM_JQ = document.createElement("script");
GM_JQ.src = "http://code.jquery.com/jquery-latest.min.js"; // for i can change display text on web  , or change style
GM_JQ.type = "text/javascript";
document.getElementsByTagName("head")[0].appendChild(GM_JQ);
GM_wait();

function GM_wait()
{
    if (typeof unsafeWindow.jQuery == "undefined")
        window.setTimeout(GM_wait, 100);
    else
    {       
        album_expander(unsafeWindow.jQuery);       
    }
}

function album_expander($)
{   
    if ($("div font input:first").html() !=null)
    { //同意按鈕
        $("div font input:first").trigger('click');
    }
    else
    {//下載連結
        var link = "https://etds.ncl.edu.tw/" + $("tr td a").attr("href") ;
        //$("div.base_top").html( link );        //$.get(link);        //$("tr td a:first").click();  //本來要觸發使用結果失敗
        location.href = link ;
    }   
}

 

後來呢...發現很笨...因為剛剛想說直接替換到後來的連結就好了

以為他有做驗證,一定要按我同意等等...

結果原來是我剛超過時間太久cookie 失效了...

後來就直接把原本頁面replace 掉就可以了...

function album_expander($)
{   
    subject = $("body").html() ;
    result = subject.replace("say\.jsp\?FT=Y&id=([^\"]*)" , "ftpDownload?id=001&account=$1&OK=Y&I=N");   
    $("body").html(result);
}

結論是...我 真笨..........XD

2008年6月7日星期六

bwmorphEmu

每次要處理一些東西就會停住想要用哪個形態學的演算法

後來乾脆,寫一個很簡單到不行的列舉(也不能叫列舉啦XD)

就給一張圖,然後把所有bwmorph都執行一次

使用前記得要…

1.建立一個morph資料夾

2.需要的話網頁檔記得摳回去(方便顯示)

沒什麼就方便顯示而已..

image

----------

bwmorphEmu.m

clear all; close all;
% bwmorph enum 列舉所有結果
I = imread('me/test.png');

BW = I ; % color 要注意
disp('run');
imwrite(BW,'morph/00_source.png');clc,disp('0%');
BWM = bwmorph(BW,'bothat');imwrite(BWM,'morph/00_bothat.png');clc,disp('10%');
BWM = bwmorph(BW,'bothat');imwrite(BWM,'morph/00_bothat.png');
BWM = bwmorph(BW,'tophat');imwrite(BWM,'morph/01_tophat.png');
BWM = bwmorph(BW,'bridge');imwrite(BWM,'morph/02_bridge.png');clc,disp('20%');
BWM = bwmorph(BW,'clean');imwrite(BWM,'morph/03_clean.png');
BWM = bwmorph(BW,'close');imwrite(BWM,'morph/04_close.png');clc,disp('30%');
BWM = bwmorph(BW,'diag');imwrite(BWM,'morph/05_diag.png');clc,disp('40%');
BWM = bwmorph(BW,'dilate');imwrite(BWM,'morph/06_dilate.png');clc,disp('45%');
BWM = bwmorph(BW,'erode');imwrite(BWM,'morph/07_erode.png');clc,disp('48%');
BWM = bwmorph(BW,'fill');imwrite(BWM,'morph/08_fill.png');clc,disp('50%');
BWM = bwmorph(BW,'hbreak');imwrite(BWM,'morph/09_hbreak.png');clc,disp('55%');
BWM = bwmorph(BW,'majority');imwrite(BWM,'morph/10_majority.png');clc,disp('70%');
BWM = bwmorph(BW,'open',Inf);imwrite(BWM,'morph/11_open.png');
BWM = bwmorph(BW,'remove',Inf);imwrite(BWM,'morph/12_remove.png');clc,disp('71%');
BWM = bwmorph(BW,'shrink',Inf);imwrite(BWM,'morph/13_shrink.png');
BWM = bwmorph(BW,'skel',Inf);imwrite(BWM,'morph/14_skel.png');clc,disp('80%');
BWM = bwmorph(BW,'spur',Inf);imwrite(BWM,'morph/15_spur.png');
BWM = bwmorph(BW,'thicken',Inf);imwrite(BWM,'morph/16_thicken.png');clc,disp('90%');
BWM = bwmorph(BW,'thin',Inf);imwrite(BWM,'morph/17_thin.png');

clc,disp('100% ,done');

-------

show.htm

<li>00.source<br/><img src="00_source.png"></li>
<li>00.Bothat<br/><img src="00_bothat.png"></li>
<li>01.Tophat<br/><img src="01_tophat.png"></li>
<li>02_bridge<br/><img src="02_bridge.png"> </li>
<li>03_clean<br/><img src="03_clean.png"> </li>
<li>04_close<br/><img src="04_close.png"> </li>
<li>05_diag<br/><img src="05_diag.png"> </li>
<li>06_dilate<br/><img src="06_dilate.png"> </li>
<li>07_erode<br/><img src="07_erode.png"> </li>
<li>08_fill<br/><img src="08_fill.png"> </li>
<li>09_hbreak<br/><img src="09_hbreak.png"> </li>
<li>10_majority<br/><img src="10_majority.png"> </li>
<li>11_open<br/><img src="11_open.png"> </li>
<li>12_remove<br/><img src="12_remove.png"> </li>
<li>13_shrink<br/><img src="13_shrink.png"> </li>
<li>14_skel<br/><img src="14_skel.png"> </li>
<li>15_spur<br/><img src="15_spur.png"> </li>
<li>16_thicken<br/><img src="16_thicken.png"> </li>
<li>17_thin<br/><img src="17_thin.png"> </li>

2008年5月7日星期三

Matlab Simulink Tools

image

靠...太酷了吧..這樣拉一拉就不用寫程式了.....

2008年4月26日星期六

Matlab 影像的小紀錄

有時候經過一些處理後 ,會發生錯誤..

原來是色階的問題,原本彩色透過譬如二值化,所得到的就是一張binary的圖 ,所以你要在丟進去非 二元影像的filter 去處理的話,常常就會遇到錯誤,所以這方面要記得,不然有時候會找個bug找很久..

 

譬如...

mask = imread('mask.png');

mask =im2bw(mask,0.25);

%此時如果你想要將之找邊緣, 已經不能用 edge 這個函式 , 而是要用

mask  = bwmorph(mask , 'remove');

% bwmorph 為二值化的影像所要用的一些形態學的函式

2008年4月24日星期四

USB Tiltstick

http://www.harbaum.org/till/tiltstick/index.shtml

有電路圖可以自己做加速器測量的 ,and software

2008年4月22日星期二

取無名小站好友名單的Regular

value=([\\w]+)>[^(<]+(\\(([^<]*)\\))?

2008年4月16日星期三

Flickr Webcam Uploadr 0.2 beta

image

image

第一次使用需要OAuth 去跟你的Flickr Account 作驗證,當取得一個token 之後代表你同意使用我的程式對你的Flickr相簿作存取或者寫入 (write) , 之後我這邊會取得一個token ,之後我取得write 權限就必須使用這個token去作驗證 , 等於說使用者隨時可以中止這個token的權限 !!

挺喜歡flickr這種作法的 , 不像有些站 , "請輸入你的帳號密碼 , 請放心我們不會紀錄你的帳號密碼 " ....問題是...who konws ?!

程式碼寫的很亂 , 修改後在丟 source code 出來~~

這次改了一些東西

2008.04.16

-驗證只需要一次,至後會紀錄在電腦內,除非你想要清掉你的驗證token
-畫面上下瘨倒的問題解決 (其實這本來就很簡單 XD ..懶惰而已 )
-一些描述也可以自訂,也會紀錄
-Tags 部份也會紀錄
- 日後會加上固定增加至"webcam"  PhotoSets

2008.04.19
-把 Form 跟 Flickr 分開了,本來懶惰就把他寫在一起, 後來獨立成 FlickrAgent , 主要就是把自己的方法把FlickrNet 在包起來而已
-Access Violation  @ Bitmap RotateFlip  , 主要是關閉視窗時候沒先把 camDevice 關閉,導致在結束程序的時候他照樣去存取 e.Frame , 而 frame是 null 卻又執行 rotateFlip 的存取錯誤!

-InvalidOperationException
The exception that is thrown when a method call is invalid for the object's current state.

#violation 犯法 / 犯罪

C# 中要紀錄應用程式設定值

在專案設定中 增加 "設定變數" , 會被紀錄到 app.config

透過 Setting.setting 這個類別會自己幫擬作處理

使用方法就是

先宣告物件

Properties.Settings setting = new FlickrWebcamUploadr.Properties.Settings();

setting.[String] = "test";

那個[string]就是你自己設定的變數

每次就可以紀錄你application 的設定值!

對了記得要

setting.Save();

紀錄才有效!

2008年4月15日星期二

Canvas using Javascript

   1:  <html>


   2:   <head>


   3:    <script type="application/x-javascript">


   4:          var x = 0 ; 


   5:          var y = 0 ;   


   6:          var der = 3 ; 


   7:          var der = 3 ; 


   8:          function SetDraw()


   9:          {


  10:              var canvas = document.getElementById("canvas");


  11:              var ctx = canvas.getContext("2d");


  12:              ctx.translate(1, 1); //座標轉換


  13:              //ctx.rotate( (der++)%360 * Math.PI / 180);  // 轉動 


  14:              


  15:              draw();


  16:          }


  17:          function draw() 


  18:          {


  19:              var canvas = document.getElementById("canvas");


  20:              var ctx = canvas.getContext("2d");


  21:              


  22:              ctx.clearRect(0,0,600,600);


  23:              ctx.save();            


  24:              ctx.rotate( der * Math.PI / 180);  // 轉動 


  25:              ctx.fillStyle = "rgb(200,0,0)";  // 把「填滿樣式」設為紅 200 綠 0 藍 0


  26:              ctx.fillRect (x++, y++, 50, 50);   // 畫一個填充的長方形


  27:              ctx.restore(); 


  28:              


  29:              setTimeout("draw()",50); 


  30:          }


  31:    </script>


  32:   </head>


  33:   <body onload="SetDraw()">


  34:     <canvas id="canvas" width="600" height="600"></canvas>


  35:   </body>


  36:  </html>





最近看到osdc.tw 有日本人使用 wii 在網頁上展示 wii remote 的3D 控制 , 查了一下canvas 資料,還挺有趣的 , 之前一直認為支援度還不高 ... 剛完了一下還不錯 , 大概IE6 不能跑而已吧

2008年4月14日星期一

YouTube - Laser-based Tracking

YouTube - Laser-based Tracking

用Laser 控制 , 挺炫的

2008年4月1日星期二

SnagIt Screen Capture Plugin for LiveWriter

SnagIt Screen Capture Plugin for LiveWriter

Windows Live Writer 的外掛, 可以直接擷取螢幕圖片當作blog的圖片...

附有source code

FlickrWebcam Uploadr beta

MWSnap 2008-04-01_19_47

(顛倒是...沒處理的關係 XD)

步驟

  1. 認證Flickr ID
  2. 取得Auth (token)
  3. 取得webcam JPG , write into MemoryStream
  4. flickr uploadPhoto , get photoID (每一張圖都有一個ID)
  5. 增加photoID至SetID
  6. 成功

如此就可以上傳至Flickr某個Set

功能已經可以了,不過flickrNet 的 Upload 有一個問題

他有多載

  • String photoId = flickr.UploadPicture((Stream)ms, title, description, tag, 0, 1, 0);

ms 在 bmp.save(ms, ...) 的時候有寫進去MemoryStream , 不過在經過uploadPicture後,居然是空的...

然後就會發生flickrException了 XDDDD

所以改用這樣

  • String photoId = flickr.UploadPicture("c:\\hi.bmp", title, description, tag, false, true, false );

但缺點就是必須作IO 讀/取各一次 ,跟直接在Memory處理會有差別 ...

先降...預計作成Auto Timer Upload!

  • beta code (裡面的flickr apiKey 和 secret key 我拿掉了,請填自己的 )

參考 :

Technorati 的標籤:,,,,,,,

MsnPlug Interface IDE

Messenage Live Plug 的程式人員會用到的ide

基本上他的code 是用script 來寫,來介面也是

於是就有介面IDE這種東西出來

MWSnap 2008-04-01_16_17

他寫好後會產生一些XML 的介面描述檔 , 然後你只要在去寫script就可以了,基本上這個IDE沒有寫Script code 的功能...

2008年3月31日星期一

Webcam跟雷射筆 畫圖

在codeproect 看到用雷射筆送出指令 (上下左右)

後來拿來改成可以畫圖...概念是出來了...

還沒把他整理好...現在大概是還不能見人的code :

Code

CodeProject: .NET DUMeter clone. Free source code and programming help

CodeProject: .NET DUMeter clone. Free source code and programming help: ".NET DUMeter clone"


C#版的 DUMeter (source code)

Webcam C#

1.安裝 Aforge

2.加入參考

//取得list
FilterInfoCollection[] videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);

//取得所選擇device
VideoCaptureDevice videoSource = new VideoCaptureDevice( videoDevices[0].MonikerString );

//設定callback fucntion
videoSource.NewFrame += new NewFrameEventHandler( video_NewFrame );

// if u wanna start
videoSource.Start( );

// remember to stop it
videoSource.SignalToStop( );

//callback
private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
Bitmap bitmap = eventArgs.Frame;
}

2008年3月29日星期六

Coding4Fun : Bluetooth ScreenLock

Coding4Fun : Bluetooth ScreenLock: "Bluetooth ScreenLock"

Coding4Fun : Don't touch me! - Interfacing with a Fingerprint Reader

Coding4Fun : Don't touch me! - Interfacing with a Fingerprint Reader

指紋SDK

Lenovo 的 X61T "Sensor.dll" 陀螺儀

原來X61T 的硬碟停止偵測是使用陀螺儀阿..

後來ccn在網路看到,一開始找是 shockmgr.sys ,不過發現我這台沒有,於是找到sensor.dll 這個東西

後來寫了一些程式來測試,他有x / y 軸,相當好玩

於是ccn提議使用UDP傳到一台電腦當控制,用來上bbs 等等

影片看這

Johnny Chung Lee - Projects - Wii

Johnny Chung Lee - Projects - Wii: "Johnny Chung Lee"

寫 Wii Sdk 的人 , 而且有很多好玩點子

2008年3月28日星期五

孤影棧: C#中??的用法

孤影棧: C#中??的用法: "string message = null;
string result = message ?? 'message is null';
Console.WriteLine(result); //列印出 message is null"

-------------------
他的意思就是

如果 你的物件宣告指向為一個null 變數, 就把 ?? 後面的值給前面

2008年3月24日星期一

Matlab 影像處理 簡易指令

很久沒用matalb ...
影像處理真方便 XD ...
下面當作紀錄用

close all % 關閉所有
BW1 = imread('srcImage.png');
BW1 = rgb2gray(BW1); % 轉換 rgb
se = strel('disk',2); % 結構
BW2 = imopen(BW1,se) ; % 影像開啟
imshow(BW1);
imtool(BW1);
impixelregion; % 顯示工具檢視 value
%figure,imshow(BW2); %顯示
%figure,histeq(BW2); %等化
%figure,imhist(BW2); %職方圖
subplot(1,2,1), surf(double(BW1(1:8:end,1:8:end))),zlim([0 255]); % 顯示成3d
set(gca,'ydir','reverse');

2008年3月16日星期日

剪貼簿

Clipboard.SetText(textBox2.Text);

2008年3月13日星期四

把Bitmap轉為Array[,]

代補

2008年3月12日星期三

Bitmap 的SetPixel GetPixel

要使用.net作影像處理的人應該都會查到set/get pixle 這兩個方法...
用過後的結論應該就是....超慢..

那是由於每次的呼叫function 會造成副程式的stack等等問題造成這麼慢

後來應該會找到使用unsafe 的方式 ,不過卻非常的不方便,因為靠指標來處理要抓上下左右pixel要非常的小心,不然就會隨時存取到不可存取的記憶體位置.

後來我想就寫了兩個 Bitmap 2 Array , Array to Bitmap 的方式

一次直接把bitmap 讀到 array , 等待 array 處理結束就可以用array塞回去給bitmap

就可以照著以前C 的時候寫的方式來處理了

2008年3月5日星期三

Win32 API與.NET Framework的對應表

Win32 API與.NET Framework的對應表: "Win32 function Description .NET Framework API
DebugActiveProcess Enables a debugger to attach to an active process and debug it. System.Diagnostics.Debugger.Launch
DebugBreak Causes a breakpoint exception to occur in the current process. System.Diagnostics.Debugger.Break
IsDebuggerPresent Determines whether the calling process is running under the context of a debugger. System.Diagnostics.Debugger.IsAttached
OutputDebugString Sends a string to the debugger for display. System.Diagnostics.Debugger.Log"


debug 進行 debug!!!!

device context Definition

device context Definition: "A data structure in Windows programming that is used to define the attributes of text and images that are output to the screen or printer. The device context (DC) is maintained by GDI. A DC, which is a handle to the structure, is obtained before output is written and released after the elements have been written. See GDI."

2008年2月27日星期三

Enumerators in C#

Enumerators in C#: "IEnumerator EmpEnumerator=EmpList.GetEnumerator(); //Getting the Enumerator
EmpEnumerator.Reset(); //Position at the Beginning
While(EmpEnumerator.MoveNext()) //Till not finished do print
{
Console.WriteLine((Employee)EmpEnumerator.Current);
}
}"


GetEnumerator()使用的方法!

2008年2月26日星期二

WScript Object Properties and Methods

WScript Object Properties and Methods: "WScript Object Properties and Methods"

2008年2月18日星期一

CodeProject: Using SQLite in your C# Application. Free source code and programming help

CodeProject: Using SQLite in your C# Application. Free source code and programming help

利一個參考demo

C#開源資源大全

C#開源資源大全-測試工具

介紹很多 C#會用到的外掛資源,很豐富!!

SQLite using C#

Finisar.SQLite

似乎是由 Finisar 來開發的 C# SDK

finisar官方下載 .net version 後,要引用有幾個步驟

1.在 VS 中在參考中引用 SQLite.NET.dll
2.將 SQLite3.dll 跟 SQLite.dll 加入專案中,並且把屬性改為永遠複製到資料夾

上面連結有一個很簡單的範例:

我稍微加了些註解

using Finisar.SQLite;

// 要用到的物件宣告
SQLiteConnection sqlite_conn;
SQLiteCommand sqlite_cmd;
SQLiteDataReader sqlite_datareader;

// Create!
sqlite_conn = new SQLiteConnection("Data ource=database.db;Version=3;New=True;Compress=True;");

// Open
sqlite_conn.Open();

// 要下任何命令先取得該連結的執行命令物件
sqlite_cmd = sqlite_conn.CreateCommand();

// 要下的命令
sqlite_cmd.CommandText = "CREATE TABLE test (id integer primary key, text varchar(100));";

// 執行
sqlite_cmd.ExecuteNonQuery();

// Lets insert something into our new table:
sqlite_cmd.CommandText = "INSERT INTO test (id, text) VALUES (1, 'Test Text 1');";

// And execute this again ;D
sqlite_cmd.ExecuteNonQuery();

// 以下列出結果
sqlite_cmd.CommandText = "SELECT * FROM test";

// Now the SQLiteCommand object can give us a DataReader-Object:
sqlite_datareader=sqlite_cmd.ExecuteReader();

// The SQLiteDataReader allows us to run through the result lines:
while (sqlite_datareader.Read())
{
// Print out the content of the text field:
System.Console.WriteLine( sqlite_datareader["text"] );
}

// 好習慣,關掉他
sqlite_conn.Close();

之後就是產生一個 *.db 檔 , 好處就是跟access 一樣,他是單一個檔案,也不必架設什麼service

隨著資料夾放就可以了,另外還有 for arm的版本,就是手機的版本,有興趣的可以去他官方看看!

2007年10月11日星期四

C# 中 將 Image 物件 轉換為 Array

透過 memoryStream 就可以很簡易的轉換成array (p.s toArray() ) XD...

也可以轉回去 image.FormStream() ;

cool

http://www.codeproject.com/Purgatory/ImageConverter.asp

2007年10月8日星期一

將 CvImage 轉換為 C# 的Bitmap

在OpenCv 的google group有找到一篇

跟我當初想的是一樣,只是我當初是想用 double [] 去丟 new CvImage(..)

不過不太清楚他的 Double 裡面順序是怎樣,弄不出來

後來找到這個方法, 使用 getPixelAddr的方式...挺直覺得..

只是他弄出來是灰階的,後來小改了一下,getPixelAddr的 channel 的部份她沒有選擇其他channel

下面就可以正常顯示彩色了

private Bitmap cvImage2Bitmap(CvImage cvimg)
{
Bitmap bmpTarget = new Bitmap(cvimg.Size.width,cvimg.Size.height, PixelFormat.Format24bppRgb);
BitmapData data = bmpTarget.LockBits(new Rectangle(0, 0, bmpTarget.Width,bmpTarget.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);

unsafe
{
byte* imgPtr = (byte*)(data.Scan0);
for (int y = 0; y < data.Height; y++)
{
for (int x = 0; x < data.Width; x++)
{
*imgPtr++ = *(byte*)(cvimg.getPixelAddr(x, y, 0).ToPointer());
*imgPtr++ = *(byte*)(cvimg.getPixelAddr(x, y, 1).ToPointer());
*imgPtr++ = *(byte*)(cvimg.getPixelAddr(x, y, 2).ToPointer());
}

imgPtr += data.Stride - data.Width * 3;
}
}
bmpTarget.UnlockBits(data);
return bmpTarget;
}

2007年9月12日星期三

ToolStripTextBox 沒有 password 的功能?

原來..

直接設定

ToolStripTextBox .TextBox.PasswordChar = '*' ;

就可以了...

他被包在裡面..

2007年9月10日星期一

C# 判斷檔案是否為圖檔


string file = @"d:\34.jpg";

System.IO.FileStream fs = new System.IO.FileStream(file, System.IO.FileMode.Open);

int a = fs.ReadByte(); //equ 255

int b = fs.ReadByte(); //equ 216


that's

2007年9月5日星期三

ListBox 的Sender

toolStripAlbumList.SelectedIndex.ToString() --> 點選的那個 index

2007年9月4日星期二

Dictionary 的 KeyValuePair

用了一下 Dictionary ,

如果add 了很多項目進去..

要如何用 foreach抓取呢?

一開始我使用 .GetEmn()

結果好像有問題...

後來翻了翻書...原來是要使用

foreach(KeyValuePair<><> kvp in myDict)
{
}

要使用 KeyValuePair

2007年9月3日星期一

Regex 的Split 使用

String[] albumItem = Regex.Split(albumDetailString, "
")

2007年8月30日星期四

[C#]POST方式的超時改進與允許接收HTML代碼的改進(接上)-Sipo Blog

1.
[C#]POST方式的超時改進與允許接收HTML代碼的改進(接上)-Sipo Blog

2.
http://progtutorials.tripod.com/C_Sharp.htm

3.
http://blog.csdn.net/ideawu/archive/2007/08/18/1749417.aspx
用WebClient 上傳的方法!

2007年8月28日星期二

c# 之 "@"是幹麻的

在PTT 有找到兩個解釋

作者id: deuter (Harold)

"兩種用途, 第一種比較常見, 放在字串前, 例如
stting s = @"c:\temp\test.txt";
方便閱讀, 這樣就不用寫成 "c:\\temp\\test.txt"

另一種用途是可以讓你用保留字來當作變數名稱, 例如你可以寫
int @class = 0;
string @if = "abc";

class, if 都是保留字, 但是加了@就可以當成變數名字
不過顯然這不是很好的寫法"

ASP.NET 2.0 FileUpload Control

ASP.NET 2.0 FileUpload Control

如何使用FileUpload

FileUpload 會有一些方法

可以看檔案史是否已經存在,檔案名稱等等~~~~

c# 的 WebRequest / Web Respone

WebRequest wb = WebRequest.Create("http://www.csie.stut.edu.tw/images/Banner/007.jpg");
WebResponse wr = wb.GetResponse();

Stream strm = wr.GetResponseStream();

Bitmap bmp = new Bitmap(strm);

pictureBox1.Image = bmp;

要求以及接收


----http

HttpWebRequest httpR = (HttpWebRequest)HttpWebRequest.Create("http://www.csie.stut.edu.tw/images/Banner/007.jpg");
HttpWebResponse httRe = (HttpWebResponse) httpR.GetResponse();

Stream myStream = httRe.GetResponseStream();
Bitmap bmp = new Bitmap(myStream);
pictureBox1.Image = bmp;

---- Web


HttpWebRequest httpR = (HttpWebRequest)HttpWebRequest.Create("http://www.csie.stut.edu.tw/");
HttpWebResponse httRe = (HttpWebResponse) httpR.GetResponse();

Stream myStream = httRe.GetResponseStream();

byte[] mybyte = new byte[1024];
string pagecontent = "";
int readl = 0;

do
{
readl = myStream.Read(mybyte, 0, 1024);
pagecontent += Encoding.UTF8.GetString(mybyte, 0, 1024);
} while (readl > 0);

webBrowser1.DocumentText = pagecontent;
//webBrowser1.DocumentStream = myStream;

Console.WriteLine(httRe.Headers); //頭檔
Console.WriteLine(httRe.ResponseUri); //網址


//WEbClient 的方法
後來發現用webclient 的方法不能直接傳到具有 upload file 元件的aspx 網頁上

後來在 MSDN 找到 Server 端的程式 ,利用HTTP Post 物件來抓取

HttpPostedFile file = Request.Files[f];
file.SaveAs("c:\\inetpub\\test\\UploadedFiles\\" + file.FileName);
}
}


剛剛試了一下就成功了!

Google Code Search

以前就有再用 http://www.google.com/codesearch?hl=zh-TW

google 的 code search

lang: 可以設定你的語言 , 譬如 c#

"webClient lang:c#"

就可以找相關的code

2007年8月27日星期一

about C# ListView

ListView 中的 column 是每一行的標題

一個listview 會有好幾個標題
listview.column.add("1");
listview.column.add("2");
listview.column.add("3");

出來結果就是

+----+-----+----+
| 1 | 2 | 3 |
+-----+----+----+
| | | |
+-----+----+----+


接下來使用

ListViewItem m = new ListViewItem () ;
產生每個行內要放的資料

一行就放一個 listviewItem

而每一個listViewItem 會有好幾個欄 ( 1, 2, 3)

稱為 SubItem

因此

listViewItem.SubItems.Add("..data1");
listViewItem.SubItems.Add("..data2");
listViewItem.SubItems.Add("..data3");

就可以產生一個有資料的欄

可以看見


+----+-----------+------+
| 1 | 2 | 3 |
+-----+---------+-------+
| | data1 | data2 |
+-----+----------+------+

這是因為每一個 Column 有一個 Header

也就是標題

所以遇設會有一個"標頭"

解決的方式是在listviewitem產生的時候就可以設定

listViewItem list = new listViewItem("Header1");

這樣就可以了

2007年8月14日星期二

BackgroundWorker 元件



















在 DoWork() 中是不能使用 GUI 中的任何資源的

因為他已經再另一個 Thread中工作

因此可以透過BackgroundWorker 中的其他方法來處理

(p.s 以下不是正式的code)

doWork()
{
bw.ReportProgress( ... ) ;
}

會去呼叫一開始事件設定的 ReportProgress(..) 的事件

當中可以去使用到GUI 的資源事沒問題的

(我猜想他是有先處理 thread 的暫停等等問題)

如果需要參數傳遞給 ReportProgress的話

可以在ReportProgress 中傳遞

會有兩個參數 int param1 , object param2

第一個似乎是你的進度,

如果你有別的東西要傳 ( bitmap , image 等等..)

在接收中使用 Bitmap bmp = (Bitmap) e.UserState;

可以抓取到物件

2007年7月30日星期一

c#中的jpge 品質設定

...

c# 中高品質的縮圖方式

Graphics 物件的屬性設定就有這個方法

//設定高品質插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

//設定高品質,低速度呈現平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

不過當然,開了這個功能執行速度就會變慢 (小量的話應該感覺不大)

延伸閱讀 : http://www.gocsharp.net/thread/topic604_1.aspx

2007年7月27日星期五

firefox extension - Tab Effect

一個FF的外掛

相當的絢麗...

他很像linux的 xgl 翻轉的部份

兩個tab 之間選取後,他會顯示3D的模式翻轉 XD

效能來講感受不到什麼差異

不過因為加入了動畫效果..所以原本可以依切換過去就可以看到

需要一些時間才會看到另一個tab

(這就看自己選擇了...要炫還是要快)

但是至少系統的資源沒什麼感覺

好用的免費螢幕動態擷取 - CamStudio

CamStudio - Free Screen Recording Software

他可以採影片的方式將你的操作畫面記錄下來

並且是免費的~~

現在很多教學都有採用類似這種軟體

2007年7月25日星期三

c# 的subClass

表示
mainClass+subClass

宣告

mainClass.subClass a = new mainClass.subClass ();

c# 的 IEnumerator() HOWTO

當一個物件有實作 ienumerator 介面後
可以使用 GetEnumerator() 將裡面的東西一一取出
使用方式為 ( 在此以 listView為示範 )

//litem as listViewItem

IEnumerator EmpEnumerator=litem.SubItems.GetEnumerator() ;
EmpEnumerator.Reset();

while(EmpEnumerator.MoveNext())
{
ListViewItem.ListViewSubItem listSub = (ListViewItem.ListViewSubItem)
EmpEnumerator.Current;
Console.WriteLine(listSub.Text);
}

利用一個 MoveNext() 來逐一檢查是否有下個資料

之後透過 cast 來抓取裡面的物件

C# Control 的ListView 架構


最近才摸這個控制項,不是很好懂 XD

網路抓到一個範例程式 , 稍微看一下code 還挺清楚的

順便做整理

ListView顯示模式有好幾種 , 圖片以 detial 顯示

ListView 裡面可以放 ListViewItem, 好幾個

ListViewItem 又可以增加 SubItem

可以看到圖中的每一個左到右的數值都是 SubItem
譬如第一個SubItem

"Bullet Proof F.." , 391 , "then Being a spy can.."

將這些都增加到 ListViewItem

使用 listView.item.add() 放 listViewItem到 ListView 裡面

因此每行會有3個項目


增加Columns ,

這時候還沒有標題

利用 listAuthors.Columns.Add (...) 可以增加項目(類似標題)

that's

C# 事件的呼叫

別的control 的事件呼叫可以利用

cmdFillList_Click(null, null);

利用null 來呼叫

其實可以的話最好在event 內去呼叫另一個方法

2007年7月20日星期五

Face Detection in Color Image 問題



某公式 :

faceycbcr.Cb = (ycbcr.Cb - faceycbcrdash.Cb) * (WCb / WCbY) ;// +faceycbcrdash.Cb;
faceycbcr.Cr = (ycbcr.Cr - faceycbcrdash.Cr) * (WCr / WCrY) ;// +faceycbcrdash.Cr;

他的+ Ci(Kh) 其他都是 Ci(Y)沒有提到 Kh 會是什麼

把加減拿掉

似乎只會偵測到一些邊緣

2007年7月19日星期四

C#的前置處理 , #if , #else #endif ..#warning

有一些前置處理 (preprocossor) #if , #endif #end 等等..

挺好用的

譬如有些程式碼你希望只有在debug才會顯示在正常執行時不要處理這些程式碼..

你可以在 using 之前加上

#define DEBUG

如此一來你可以在你想要debug 時顯示的程式碼加上

#if (DEBUG)
//do something ...
#endif

另外如果你是使用 visual studio 的話,再專案的設定那邊也有一個"定義 DEBUG 常數"

他似乎會在外部幫你定義 DEBUG 這個常數



當然你也可以自己定義其他常數

#define VC6
#define FACE
#define WEBCAM

等等

另外 #define 不能給予任何值,預設就是 true ,所以你如果該變數沒有定義就是false

還有你也可以透過外部 shell 加上 /define 來定義變數 利用 #undef 來取消常數

譬如外部使用 compile with: /d:DEBUG

你在程式中使用 #undef DEBUG

DEBUG 將會是 false 的狀態..

#warning , 可以送出警告的訊息 ,如下圖

#error

這個則是產生錯誤訊息,程式將不能執行


#line

這個則是可以設定產生錯誤的 行號還有檔名..

c# 的 Base - 呼叫父層的被覆載方法.

很像 java 之前的 father 還是 parent 關鍵字...忘記是哪個了..應該不是上面兩個 XD

譬如

class A
{
virtual void OpenDoor()
{
// 印出兩行
}
}

//--------
// B 繼承 A 後 , 可以使用 base 再次呼叫原本的方法

class B :A
{
override void OpenDoor()
{
base.OpenDoor();
//印出一行
}
}

//-------

到時候使用 B.OpenDoor() 將會在Console 印出三行指令 .

2007年7月18日星期三

Color 演算法的更改

後來發現演算法有一個地方寫錯了

改了後反而偵測率變低了 ( 甚至不能用 )

後來直接調整webcam的飽和度還有對比,發現可以變的比較好

如果把提高飽和度跟對比當作前處理應該可以真加一些偵測率!
 

c# 的 Internal ?

"Internal 成員只能在相同組件的檔案裡存取。" from MSDN

延伸閱讀 : 組件、元件...

C# 介面實作的問題

從MSDN看到的

當某個類別實作好幾個介面,但這兩個介面的方法有相同的名稱時
public class SampleClass : IControl, ISurface
{
void IControl.Paint()
{
System.Console.WriteLine("IControl.Paint");
}
void ISurface.Paint()
{
System.Console.WriteLine("ISurface.Paint");
}
}

不能直接從實作類別去呼叫,而必須分別的使用原始介面去呼叫

SampleClass obj = new SampleClass();
//obj.Paint(); // Compiler error.

IControl c = (IControl)obj;
c.Paint(); // Calls IControl.Paint on SampleClass.

ISurface s = (ISurface)obj;
s.Paint(); // Calls ISurface.Paint on SampleClass.


C# 的物件導向

到了c#後很少在撰寫繼承、實作等等的物件開發

由於最近需要用到,所以來複習一下

A 要被 B 繼承 , A<-B ( A是Parent B 是Children ) 在C# 中的語法是 class B : A { // do something... } 有幾個繼承用到的語法

1.Virtual 虛擬

如果你希望該方法被B繼承後需要或者不需被覆寫可以使用這個方法

ex. public virtual void OpenBox() { ... } , B 可以覆寫或者不覆寫

2.不加任何識別字

如此將不能覆寫A的方法

ex. public void OpenBox() { ... } , B 不能覆寫該方法

3.Abstract 抽象

抽象類別或者抽象方法,B必須去繼承A的該方法 (

p.s 覆蓋的方法或者類別必須使用 override 來覆蓋

ex. public abstract void OpenBox() { ... }

延伸閱讀 : MSDN

2007年7月17日星期二

PC RUN 內的程式碼下載

雜誌內會介紹到的程式碼可以免費下載

http://www.runpc.com.tw/download/index.htm

視覺化偵錯 ?

Microsoft.VisualStudio.DebuggerVisualizers

http://msdn2.microsoft.com/zh-tw/library/ms164759(VS.80).aspx

待查!

J204-2 Face Detection Class



自己想把一些從論文看到然後把它實作後的face detection 物件整理好..

目前還在起頭階段而已

想到的規劃namespace 是

J204_2 + - FaceDetection + ColorBased - 放置color based 方法的物件
+ OpenCvHaarBased - 放置 open CV haar 方法物件

+ - JImageProcessing -自己寫的一些影像處理演算法物件

主要是在方案的規劃下
(p.s 方案是最大的,方案下面可以有好幾個專案 )

1. Interface
會有一個介面在 J204_2.FaceDetection 內, FaceDetectionInterface

想把一些人臉偵測應該提供的方法或者屬性都寫在介面上

之後任何要增加的detection 方法去實作他 ,如此要使用這些detection 物件的話會有一個統一的操作方式


2.方案下會有每個方法的專案 ,每一個方法我會去產生一個專案,再coding階段順便可以在那個專案內進行測試等等的 (測試的方法我會再想一介面來統一使用)

譬如某某篇 color-based 的演算法我就開一個專案,去實作,依照他的based類別去命名他的namespace

3.每個方案的detection演算法完成後我會把它 copy到一個 FaceDetectionLab的專案內,如此依來當全部(或者一一完成) ,所有的detection物件就會收集在 face detection Lab內 ,到時候就是一個整合性的 face detection 專案了..

p.s 以上是我想到的管理方式...XD

由資料夾選取工具之後取得該資料夾下的檔案名稱

if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
System.IO.DirectoryInfo directPath = new System.IO.DirectoryInfo(folderBrowserDialog1.SelectedPath);

System.IO.FileInfo[] files = directPath.GetFiles();

foreach (System.IO.FileInfo file in files)
{
string fileName = file.FullName;
//... do something
}
}

2007年7月16日星期一

人臉偵測haar比較

一個是我照著台科大的一篇論文自己實作的結果

另一個是使用openCV採用 haar 的方法

使用同一張來比較...(只拿一張啦...還沒比其他的...比起來也不代表什麼啦 :P)

原圖
(後來我發現我是用網路抓的圖...所以..等我用別的圖再放好了)

使用haar
(後來我發現我是用網路抓的圖...所以..等我用別的圖再放好了)

使用台科大
(後來我發現我是用網路抓的圖...所以..等我用別的圖再放好了)
(第二個人是有抓到,不過演算法我還沒寫完 :P ...所以大致四個人都有抓出...只是我還沒寫完 :P...後處理還需要時間啦 )

使用 SharperCV 的問題

一開始安裝 sharperCV 後

裡面有一些sample 在bin/ 下

以及需要使用的 dll檔

打開裡面編譯好的exe檔, 果然是使用 haar 的人臉偵測方法

可以跑,它直接是開啟你的webcam來使用

效果還不錯

接下來,當然就是自己打開一個project 看看該怎麼使用這個 sdk

1.開啟新專案

2.加入參考 openCVWrapper(dll)

3.usin SharperCV /SharperCV.Haar

4. 產生一個 CVImage ...

步驟就省略了,有需要詳細的網友可以mail給我 XD...(打混)

反正在 CvImage a = new CvImage(...) ;的地方會出現

DllNotFoundException 的例外

後來把它的錯誤用 try catch 印出

可找到是因為 "highGUIsharper.dll" 沒有找到

可是這個 dll 不能加入參考 (這邊我就不太清楚 why )

後來試了很久,確定就是 cvImage內部會用到 "highGUIsharper.dll" 而產生的錯誤

之後看到網路(資料超少的 ),他把所有 c:\ShaperCV\bin 的 dll 都摳到 project 下面的 debug or release 資料夾下 (也就是執行目錄下)

之後就可以執行成功了

我是利用CvImage image = new CvImage("c:\text.jpg");

利用檔案來做偵測,後來果然成功了 :D

有圖有真相


(p.s 圖片是網路抓來的 )


(p.s openCV 他的演算法似乎是使用 haar )

解決沒有最近使用專案的Visual Studio 2005


之前不知道為什麼在研究是這台 VS2005 的最近專案清單都沒有顯示

一片空白阿 XD

也一直懶得處理

後來上網查了一下

在一個大陸的blog這邊找到了為什麼會這樣


解決方式 :

1. 在 regedit 中找到 "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer"

2. 有 NoRecentDocsMenu這個登錄值,將它改為 0,但是我照著那個網站照做還是一樣

3.看著 Explorer 下還有幾個登錄值 ClearRecentDocsExit 、NoRecentDocsHistory,順手也把它改為 0 看看,機會應該很大

4.果然改了後就成功了,消失快半年的清單終於出現了 XDXD (人就是懶阿 )


參考資訊 :
http://www.shengfang.org/blog/p/20070513vs2005ProjectMRUList.php

OpenCV on C#

SharperCV Project

Intel 的 OpenCv 只有支援 .Net 2005 的 c 和 c++

因為自己跟c 很久不熟了 XD

所以想說應該會有人改寫成 c#板的,果然沒有錯

http://www.cs.ru.ac.za/research/groups/SharperCV/

在這邊可以找到下載的地方...

有需要的可以去抓....

雖然我還沒用過 XD

2007年7月13日星期五

OPEN!

放一些 c# or visual studio使用過程的心得..順便自己做紀錄