要如何找座標 |
答題得分者是:justdo
|
keikojason
初階會員 發表:37 回覆:63 積分:45 註冊:2004-05-10 發送簡訊給我 |
||
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
可使用相連通(connect component)處理(一般的影像處理書籍應該都有),找出最大區塊後,再重新掃一次影像,以標定出最大和最小的座標值 可參考此篇文章 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=57520 發表人 - justdo 於 2004/10/14 22:39:56
|
|
keikojason
初階會員 發表:37 回覆:63 積分:45 註冊:2004-05-10 發送簡訊給我 |
引言: 可使用相連通(connect component)處理(一般的影像處理書籍應該都有),找出最大區塊後,再重新掃一次影像,以標定出最大和最小的座標值 可參考此篇文章 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=57520 發表人 - justdo 於 2004/10/14 22:39:56那再請問justdo我區塊有取出來了,不過小弟愚笨< >(初學者)試了好多次,那要如何取出最大的區塊請前輩指教,要如何去撰寫,有範例可以參考嗎?..小弟細心聆聽..謝謝< > |
|
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
||
keikojason
初階會員 發表:37 回覆:63 積分:45 註冊:2004-05-10 發送簡訊給我 |
||
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
為了需要知道每個區塊擁有哪些點,你需要另外一個陣列
記錄不同的區塊--藉由區塊有他自己的識別編號,如:
img2[][]為
00001000
00011002
00011022
33000000
記錄了三個區塊,其中編號1的區塊共有5個點、編號2的區塊有3個點、編號3的區塊有2兩個點,就姑且稱呼他為區塊影像好了 因此定義工作流程如下:
1.輸入原始影像,獲得區塊影像,以及每個區塊的大小
2.取得最大影像的編號,重新搜尋區塊影像,以獲得區塊四個邊界的座標 為了達成第1項工作,需要宣告幾項全域變數
int id=1; //下一個可用的區塊編號
char img2[height][width]={0}; 現在需要修改Connect函式,新增幾個功能上去
Connect(BMP, x, y)
{
計數值加1
抹除這個點
img2[y][x]=id
檢查8個方位
} 主函式:
main()
{
//第一步驟
由上而下
由左而右
{
呼叫Connect函式,傳回編號為id的區塊的數量:counts
if (counts > maxcounts)
{
maxcounts=counts;
maxid=id
}
id ;
} //第二步驟
由上而下
由左而右
{
檢查區塊標號為maxid的pixel的座標
}
|
|
keikojason
初階會員 發表:37 回覆:63 積分:45 註冊:2004-05-10 發送簡訊給我 |
引言: 主函式: main() { //第一步驟 由上而下 由左而右 { 呼叫Connect函式,傳回編號為id的區塊的數量:counts if (counts > maxcounts) { maxcounts=counts; maxid=id } id ; } //第二步驟 由上而下 由左而右 { 檢查區塊標號為maxid的pixel的座標 }這個部分還不是很懂,那要怎樣去找出最大(maxcounts),還有我怎麼用id值都是區塊數,並不是區塊數裡的數量~~小弟愚笨問,問題太蠢...是希望多學一點 |
|
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
這邊要找出最大的區塊的部份,我用了比較偷懶的方式,但概念相當簡單
舉例來說,現在有五個數字:1,4,6,2,8
每當我讀入一個數的時候,就判斷是否大於目前的最大值
若是,則令最大值(maxvalue)為現在讀進來的數
maxvalue=0;
依序讀入五個數字
step1: 1> maxvalue 所以設定 maxvalue=1
step2: 4> maxvalue 所以設定 maxvalue=4
step3: 6> maxvalue 所以設定 maxvalue=6
step4: 2< maxvalue 不作更動
step5: 8> maxvalue 所以設定 maxvalue=8 我寫的程式概念相同,但除了記錄最大的數值之外,還需要額外記錄該id的值
因此
從上而下 { 從左而右 { counts=Connect(xxxxx....); if (counts > maxcounts) //假若現在這個區塊的大小大於已知的最大區塊 { maxcounts=counts; //更新已知最大區塊的大小 maxid=id; //將擁有最大區塊的id記下來 } } }發表人 - justdo 於 2004/10/18 20:17:18 發表人 - justdo 於 2004/10/18 20:18:38 |
|
keikojason
初階會員 發表:37 回覆:63 積分:45 註冊:2004-05-10 發送簡訊給我 |
引言: step1: 1> maxvalue 所以設定 maxvalue=1 step2: 4> maxvalue 所以設定 maxvalue=4 step3: 6> maxvalue 所以設定 maxvalue=6 step4: 2< maxvalue 不作更動 step5: 8> maxvalue 所以設定 maxvalue=8問如果我要找出每區塊內的數目,並且取出每一個去塊做比較大小要怎樣撰寫呢?嘗試好多次,不知道要加在哪裡,是不是我以前沒有學過有關程式語言,有些與我想的邏輯觀念不同,有些觀念相反,好奇怪喔!!快亂囉...前輩請指教為我解惑...謝謝int id=0,counts=0; char img2[320][240]={0}; BMP->Assign(Image1->Picture->Bitmap ); for(int y = 0; y < BMP->Height; y ) { ptr = (Byte *) BMP->ScanLine[y]; for(int x = 0; x < BMP->Width; x ) { if(ptr[x * 3] == 255) { counts=Connect(BMP, x, y); if (counts > maxcounts) { maxcounts=counts; maxid=id; } Area ; id ; } } }[ |
|
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
||
keikojason
初階會員 發表:37 回覆:63 積分:45 註冊:2004-05-10 發送簡訊給我 |
這是依照你說的方式做比較..不過我是用指標方式,就是沒有辦法抓去他所回傳的counts值,回傳值都是"1"沒有辦法回傳該搜尋區塊的數量,因而無法比較,是我用錯嗎?還是有其他原因..請前輩指教...謝謝
< class="code">
int *com(int);
//----------------------------------------
int *com(int k)
{
int y,maxcounts=0; if(k > maxcounts)
{
maxcounts=k;
y = maxcounts; }
return (&y); }
//----------------------------------------
int __fastcall TForm1::Connect(Graphics::TBitmap * BMP, int x, int y)
{
int counts=0;
int *k;
total ;
counts ;
k=com(counts);
Edit5->Text=IntToStr(&k);
.
.
檢查8個方位
|
|
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
不知道你的com函式用途為何?
況且你傳回的指標所指的那個y
在com函式結束的時候,y的空間會歸還給系統,所以return指標指的那個位置已經無效了,根本是錯誤的用法 從前面的討論到現在,我覺得這個程式實在不適合現在程度的你來完成,或許你應該先從小的c程式開始練習起,待有一些基礎之後才來研究影像處理 我把完整的source code都放上來,已經測試是可以運作的了,先解決你現在要作的事,有空你在慢慢研究程式的邏輯,整個邏輯在前面的文章已經提過了,翻出來對照看看會比較容易瞭解 另外,那個原本的Connect函式還有兩個問題存在,一個是傳回的計數值是錯誤的,因為他沒有將八個方位個別傳回的pixel數累加起來;另一個是他搜尋的方位還少了一個,次數卻有九次,我都已經更正了,比照看一下就知道了 我就幫到這兒了,以後不在回覆這個話題 完整的程式碼如下:
.h檔 class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; TImage *Image1; void __fastcall Button1Click(TObject *Sender); private: // User declarations unsigned int **map; public: // User declarations __fastcall TForm1(TComponent* Owner); __fastcall Connect(Graphics::TBitmap* BMP, int x, int y); }; .cpp檔 TForm1 *Form1; int id=1; int min(int a, int b) { return (ab) ? a : b; } void __fastcall TForm1::Button1Click(TObject *Sender) { unsigned int counts=0; unsigned int maxcounts=0; unsigned int maxid=0; Graphics::TBitmap *BMP = new Graphics::TBitmap(); BMP->Assign(Image1->Picture->Bitmap ); Byte *ptr=NULL; BMP->PixelFormat = pf8bit; int width=BMP->Width; int height=BMP->Height; map=new unsigned int*[height]; for (int i=0; i |
小弟先謝謝justdo不厭其煩的告知小弟< >,抽出怎麼多寶貴時間,回答一些愚笨的問題,來為小弟解惑,真是不好意思,心想說沒有問題怎麼會學會呢?小弟就硬這頭皮上來問問題..想說問這一些笨問題回有人回答嗎?...之後讓我有點窩心< >,在上面的人都不吝嗇有問必答...< >以下是我還有些問題請為小弟解惑..謝謝~~< > 1.int id=1; 為什麼id設為1,一般初始不是設為0嗎? 2.在int min(int a, int b)與max(int a, int b)宣告,是不是讓Button再一次執行中,對最大ˋ最小座標值不會被覆蓋過去是嗎? 3.unsigned int宣告與單純的int宣告插在哪呢?還有unsigned int **map; *map算指標哪兩個**指什麼意思呢?
4.下段程式是對什麼而做運算,是對一個所開新的Map找的區域找尋最大與最小座標嗎?是不是與問題2有相對關係....還是這段有另外的意思;那在counts= Connect(BMP, x, y);中的map[y][x]=id;是怎樣的重要角色,再判斷八個方向是[x][y],而map[y][x]這樣不會影響嗎?為什麼... 5.在執行第一次時,最大區塊有多少是正確,但是如果Button連按多次就不一樣,他會以該圖共有多少的白色點的3倍累加,例如圖中全部只有一個連續區域白色點25,按第一次"1"正確;按第二次"76=1 25*3"按第三次"151(76 75)".....這是為什麼呢?
map=new unsigned int*[height]; <==怎麼解釋 for (int i=0; i發表人 - keikojason 於 2004/10/25 00:18:29 |
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
事實上,我是有點不太想回答了,因為許多問題在書上或HELP都有,對於整個程式的作法我也解釋過一遍了,但似乎您沒有自己認真的看一遍、找一遍、想一遍...
老話一句,你應該還是從簡單的程式練習起,至少也要看完一本c/c 的書吧... 1.沒錯,但是0在這邊是用來標記為「沒有區塊存在的地方」
2.不太懂你的問題
3.請查閱c/c 的書籍
4.是的,map和BMP使用不同的記憶體區域,所以相互間沒有影響
5.那是因為id是全域變數,所以會不斷的累加下去,在TForm1::Button1Click函式的第一行新增id=1;即可
|
|
keikojason
初階會員 發表:37 回覆:63 積分:45 註冊:2004-05-10 發送簡訊給我 |
||
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
||
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |