全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1541
推到 Plurk!
推到 Facebook!

建立未知邊緣座標點數

答題得分者是:istillloving
moonsea
一般會員


發表:11
回覆:15
積分:5
註冊:2007-10-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-07-09 00:14:49 IP:122.122.xxx.xxx 訂閱
在做邊緣偵測時有兩個問題想不出解決方式,
1.有時候再做邊緣偵測時不知道邊緣座標點數目,
例如POINT或是new 陣列在不知道大小情況下似乎都不能用來記錄座標點位置,
請問除了開新的Bitmap外還有沒有辦法可以在邊緣像素點數未知的情況下紀錄座標呢?
2.為了檢查邊緣是否位於兩點連線上,每一邊都分別進行比對,時間有點慢,
搜尋救文章後還是沒有頭緒,請問不知道有沒有更直接方式做比對呢?
謝謝。
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-08-04 13:25:21 IP:140.127.xxx.xxx 訂閱
您好:

第一個問題我想你使用 linklist 就能夠解決了

關於第二個問題 建議可以朝 Hough Transform 的方向下去做

http://en.wikipedia.org/wiki/Hough_transform
http://homepages.inf.ed.ac.uk/rbf/HIPR2/hough.htm

兩篇讓你了解 Hough 是用怎樣的角度去思考一個二維空間


===================引 用 moonsea 文 章===================
在做邊緣偵測時有兩個問題想不出解決方式,
1.有時候再做邊緣偵測時不知道邊緣座標點數目,
例如POINT或是new 陣列在不知道大小情況下似乎都不能用來記錄座標點位置,
請問除了開新的Bitmap外還有沒有辦法可以在邊緣像素點數未知的情況下紀錄座標呢?
2.為了檢查邊緣是否位於兩點連線上,每一邊都分別進行比對,時間有點慢,
搜尋救文章後還是沒有頭緒,請問不知道有沒有更直接方式做比對呢?
謝謝。
------
恩...
moonsea
一般會員


發表:11
回覆:15
積分:5
註冊:2007-10-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-08-08 21:40:18 IP:218.172.xxx.xxx 訂閱
感謝提供解決的方式,
linklist 部份沒研究過,
再研究看看,謝謝。
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-08-09 00:38:51 IP:220.129.xxx.xxx 訂閱
您好:

一個基本的做法


[code cpp]
struct Connection
{
int memory[2];

Connection *next;
};

[/code]

其中 Connection 是自取名

那這個字取名也是這個結構的名稱

我用個人的觀點跟你解釋一下linklist (有錯請更正)

struct Connection 佔了一塊記憶體空間

裡面包含了 一個 int 的陣列

和一個 *next 指標 這是一個結構指標

用法是這樣的

[code cpp]

void main()
{

Connection *current,*operation,*first,*temp;

}

//在main裡面我宣告了 四個 結構指標是屬於Connection
[/code]


[code cpp]

void main()

{

Connection *current,*operation,*first,*temp;

current=operation=first=new Connection;

}


//而我用動態宣告這四個指標新增一個 Connection 也就是指向同一個專屬於 Connection 的記憶體空間
//這裡 是把所有指標指向同一個空間 並不是宣告出四個空間
[/code]



[code cpp]

void main()
{
Connection *current,*operation,*first,*temp;

current=operation=first=new Connection;

(*operation).memory[0]= 5;

(*operation).memory[1]= 5;

}
//接著用指標operation作用記憶體裡面屬於memory[0]和memory[1]的位子使它存入5這個數字
//記住目前所有指標皆是指向同一個空間
[/code]



[code cpp]
void main()

{
Connection *current,*operation,*first,*temp;

current=operation=first=new Connection;

(*operation).memory[0]= 5;

(*operation).memory[1]= 5;

operation=(*operation).next=new Connection;
}
// linklist 的精隨就在這裡 一開始在宣告 Connection 這個結構的時候 就已經在裡面宣告自身的指標了也就是 Connection *next;
// (*operation).next=new Connection; 在這裡就是使用上一步所宣告出來的記憶體空間內屬於Connection *next;的這個空間
// 而這個空間存放的是結構指標所以可以利用這點再宣告出一個新的記憶體空間 這空間是屬於全新的 struct Connection
// 你體會一下 我們用第一個結構內存的指標宣告第二個結構出來 在這同時 operation=(*operation).next=new Connection;
// 我們再使用main內的 operation 來紀錄新宣告出來的記憶體位子

[/code]


[code cpp]
void main()
{
Connection *current,*operation,*first,*temp;

current=operation=first=new Connection;

(*operation).memory[0]= 5;

(*operation).memory[1]= 5;

operation=(*operation).next=new Connection;

(*operation).next=NULL;
}

//在這 (*operation).next 已經是屬於第二個結構所擁有的結構指標 ,養成好習慣記得把他接地 NULL
[/code]

那這通常我們會使用while loop 來撰寫 linklist 只要符合我們所設定的條件 就可以一直new出新的記憶體空間

等到跳出回圈後再把最後的結構指標接地 這樣就很完美了

那改怎麼存取資料呢??

還記得在main裡面已經宣告出很多指標
Connection *current,*operation,*first,*temp;
current=operation=first=new Connection;
並且把這些指標通通指向同一個開端

所以除了operation已經指向最後一塊記憶體 其他都還是停留在一開始的位子
你就可以利用這些記憶體區塊內的*next指標 一筆一筆讀取你要的資料啦

當然還有很多簡單的變化 例如 在資料內插入一筆新的資料 或只是刪除某一筆資料

善用指標 這些都不難辦到

參考

===================引 用 moonsea 文 章===================
感謝提供解決的方式,
linklist 部份沒研究過,
再研究看看,謝謝。
------
恩...
系統時間:2024-04-25 8:59:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!