residue
中階會員
發表:90 回覆:153 積分:53 註冊:2003-07-02
發送簡訊給我
|
請各位大大們指教,小弟縣用CCD擷取空間n個圓,想求出圓個別的重心座標位置??
小弟是有想到一方法,就是把每個圓的輪郭用不同的顏色圈選起來,再利用顏色加以作判別,之前版大有提供一個範例,但每個圓的輪郭只能以相同的顏色來表示,想嘗試用此程式修改就是做不出來,請問各位大大們,看看有什麼更好建議能解決此問題,或是有更好的尋找重心的方法 下圖是想做出的效果!!
謝謝!!
|
MilesWamg
一般會員
發表:18 回覆:37 積分:11 註冊:2003-02-07
發送簡訊給我
|
建議使用區域成長方式分割
使用遞迴分割此一區域,將此一區圓中每一像素座標標記後
每一群計算其中重心,即其每一圓圓心啦!
|
residue
中階會員
發表:90 回覆:153 積分:53 註冊:2003-07-02
發送簡訊給我
|
引言:
建議使用區域成長方式分割
使用遞迴分割此一區域,將此一區圓中每一像素座標標記後
每一群計算其中重心,即其每一圓圓心啦!
>>< face="Verdana, Arial, Helvetica"> 感謝大大的指導!!
但小弟寫程式的功力不夠,能不能請大大給個小範例阿 謝謝大大!!
|
residue
中階會員
發表:90 回覆:153 積分:53 註冊:2003-07-02
發送簡訊給我
|
請問個位大大能不指點一下啥是 長方式分割阿??
網站上有此範例嗎??
因為小弟有找過但找不到 謝謝
|
CMOS
一般會員
發表:1 回覆:7 積分:1 註冊:2002-10-22
發送簡訊給我
|
可以使用 Hough Transform 就可解決 範例如下 http://www.markschulze.net/java/hough/
|
JerryKuo
版主
發表:42 回覆:571 積分:322 註冊:2003-03-10
發送簡訊給我
|
引言:
請問個位大大能不指點一下啥是長方式分割阿??
網站上有此範例嗎??
因為小弟有找過但找不到 謝謝
>>< face="Verdana, Arial, Helvetica">
區域成長方式分割
|
residue
中階會員
發表:90 回覆:153 積分:53 註冊:2003-07-02
發送簡訊給我
|
引言:
引言:
請問個位大大能不指點一下啥是長方式分割阿??
網站上有此範例嗎??
因為小弟有找過但找不到 謝謝
>>< face="Verdana, Arial, Helvetica">
區域成長方式分割
感謝JerryKuo版大
那請問JerryKuo版大您有無關於區域成長方式分割這方面的詳細資訊呢??
|
JerryKuo
版主
發表:42 回覆:571 積分:322 註冊:2003-03-10
發送簡訊給我
|
|
brook
資深會員
發表:57 回覆:323 積分:371 註冊:2002-07-12
發送簡訊給我
|
引言:
請各位大大們指教,小弟縣用CCD擷取空間n個圓,想求出圓個別的重心座標位置??
你能給我計算公式嗎?就如半徑10 座標(0,0)和半徑2 座標(20,0)兩個圓,求出來的重心座標是多少?
理論上只要把兩圓的先融合成一個大圓,再和其他的圓逐一合併即可. 發表人 - brook 於 2003/11/03 13:24:09
|
JerryKuo
版主
發表:42 回覆:571 積分:322 註冊:2003-03-10
發送簡訊給我
|
引言:
請各位大大們指教,小弟縣用CCD擷取空間n個圓,想求出圓個別的重心座標位置??
小弟是有想到一方法,就是把每個圓的輪郭用不同的顏色圈選起來,再利用顏色加以作判別,之前版大有提供一個範例,但每個圓的輪郭只能以相同的顏色來表示,想嘗試用此程式修改就是做不出來,請問各位大大們,看看有什麼更好建議能解決此問題,或是有更好的尋找重心的方法
residue你好: 不知道是不是看錯了,根據上圖如果能圈住每一個圓,要找圓的中心座標應該
不難,算出每個圓的上,下,左,右邊界,上下及左右兩兩相加除2,就是中心點,如下圖。
還是問題是出在圈住每一個圓?
|
residue
中階會員
發表:90 回覆:153 積分:53 註冊:2003-07-02
發送簡訊給我
|
引言:
引言:
請各位大大們指教,小弟縣用CCD擷取空間n個圓,想求出圓個別的重心座標位置??
小弟是有想到一方法,就是把每個圓的輪郭用不同的顏色圈選起來,再利用顏色加以作判別,之前版大有提供一個範例,但每個圓的輪郭只能以相同的顏色來表示,想嘗試用此程式修改就是做不出來,請問各位大大們,看看有什麼更好建議能解決此問題,或是有更好的尋找重心的方法
residue你好: 不知道是不是看錯了,根據上圖如果能圈住每一個圓,要找圓的中心座標應該
不難,算出每個圓的上,下,左,右邊界,上下及左右兩兩相加除2,就是中心點,如下圖。
還是問題是出在圈住每一個圓?
感謝JerryKuo大大的回應 小弟現在所出的問題是不知如何,以不同顏色圈出每一個圓,因為小弟想利
用,圈住圓的顏色不同,進而求出每個圓的重心所在位置 謝謝
|
JerryKuo
版主
發表:42 回覆:571 積分:322 註冊:2003-03-10
發送簡訊給我
|
引言:
小弟現在所出的問題是不知如何,以不同顏色圈出每一個圓,因為小弟想利
用,圈住圓的顏色不同,進而求出每個圓的重心所在位置
不好意思,誤會你的意思 這個問題蠻技術性滴,也就是做出來就可以發表論文囉。開玩笑的啦 這個問題之前你就有問過,我有去查資料,也問過相關人士,得到一些資料
1.Region Growing(區域成長法)
就是MilesWamg所提的,但程式複雜度相當高,適用於靜態圖片,但要做即時影像
搜尋時,若搜尋太多物件,程式會跟不上影像的變化,不適用於即時影像。適用於
多個物件。 2.Snake(有點像區域成長法加強版)
利用邊緣搜尋(sobel之類的)得到影像的邊界,再模疑蛇的運動,沿著邊界
搜尋,得到所有邊界點之後,取最上下右左點的中心值,就是重心。也適用於多個
物件。 3.還有一些其他的... 我不是做這方面研究,這方面的資料程式就要請好心人士提供,這些程式都是值得
收藏。
|
brook
資深會員
發表:57 回覆:323 積分:371 註冊:2002-07-12
發送簡訊給我
|
|
residue
中階會員
發表:90 回覆:153 積分:53 註冊:2003-07-02
發送簡訊給我
|
引言:
你是不是想找出圖片裡,所有圓的圓心位置?
brook大大您好!!
小弟是想找出圖中,所有圓的圓心位置
|
residue
中階會員
發表:90 回覆:153 積分:53 註冊:2003-07-02
發送簡訊給我
|
引言:
引言:
小弟現在所出的問題是不知如何,以不同顏色圈出每一個圓,因為小弟想利
用,圈住圓的顏色不同,進而求出每個圓的重心所在位置
不好意思,誤會你的意思 這個問題蠻技術性滴,也就是做出來就可以發表論文囉。開玩笑的啦 這個問題之前你就有問過,我有去查資料,也問過相關人士,得到一些資料
1.Region Growing(區域成長法)
就是MilesWamg所提的,但程式複雜度相當高,適用於靜態圖片,但要做即時影像
搜尋時,若搜尋太多物件,程式會跟不上影像的變化,不適用於即時影像。適用於
多個物件。 2.Snake(有點像區域成長法加強版)
利用邊緣搜尋(sobel之類的)得到影像的邊界,再模疑蛇的運動,沿著邊界
搜尋,得到所有邊界點之後,取最上下右左點的中心值,就是重心。也適用於多個
物件。 3.還有一些其他的... 我不是做這方面研究,這方面的資料程式就要請好心人士提供,這些程式都是值得
收藏。
謝謝JerryKuo大大您辛苦囉!! 那如果單存利用索貝爾,可做的出來嗎??
|
MilesWamg
一般會員
發表:18 回覆:37 積分:11 註冊:2003-02-07
發送簡訊給我
|
1.Region Growing(區域成長法)
就是MilesWamg所提的,但程式複雜度相當高,適用於靜態圖片,但要做即時影像
搜尋時,若搜尋太多物件,程式會跟不上影像的變化,不適用於即時影像。適用於
多個物件。
....使用遞迴,檢查是不是相鄰區域並標記之,程式較簡單,但是遞迴程式較難tracking他實際運作方式,但程式碼較精簡 2.Snake(有點像區域成長法加強版)
利用邊緣搜尋(sobel之類的)得到影像的邊界,再模疑蛇的運動,沿著邊界
搜尋,得到所有邊界點之後,取最上下右左點的中心值,就是重心。也適用於多個
物件。 小弟之前玩過....Snake需要事先給定區域框框,讓Snake去縮...小範圍(好像使用能量最小的原理...)而實際使用上沒這樣理想,切的效果與一些參數設定有關 發表人 -
|
JerryKuo
版主
發表:42 回覆:571 積分:322 註冊:2003-03-10
發送簡訊給我
|
引言:
那如果單存利用索貝爾,可做的出來嗎??
residue: 由sobel得到的輪廓,對於電腦來說也只是張圖而已,要辨別物體位置,還是需
要許多演算法。你用顏色來區分是很好想法,要把圓用不同的顏色圈起來,小弟
能想到的,只有snake。這方面就要請教MilesWamg。
|
residue
中階會員
發表:90 回覆:153 積分:53 註冊:2003-07-02
發送簡訊給我
|
引言:
residue: 由sobel得到的輪廓,對於電腦來說也只是張圖而已,要辨別物體位置,還是需
要許多演算法。你用顏色來區分是很好想法,要把圓用不同的顏色圈起來,小弟
能想到的,只有snake。這方面就要請教MilesWamg。
感謝JerryKuo大大的回應
那請問要如何,<>把圓用不同的顏色圈起來> 謝謝!!!
|
brook
資深會員
發表:57 回覆:323 積分:371 註冊:2002-07-12
發送簡訊給我
|
土法煉鋼,看看合不合用?
//--------------------------------------------------------------------------- #include
#include
#pragma hdrstop #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{ }
//--------------------------------------------------------------------------- TStringList *Ls[10]; void vAddToList(int LsNo,int x,int y,int w)
{
int i;
AnsiString ss;
for (i=0;iAdd(ss);
}
} int iInList(int LsNo,int x,int y,int w)
{
int i,j;
AnsiString ss;
int xx,yy; for (i=Ls[LsNo]->Count-1;i>0;i--)
{
ss = Ls[LsNo]->Strings[i];
sscanf(ss.c_str(),"%d%d",&xx,&yy);
if (yy == y-1)
{
for (j=0;jCount)
{
if (iInList(i,x,y,w)) break;
} else
{
vAddToList(i,x,y,w);
break;
}
}
} int iBlackDot(int x,int y,int w,Byte *ptr)
{
int i;
for (i=0; iCount;i )
{
ss = Ls[LsNo]->Strings[i];
sscanf(ss.c_str(),"%d%d",&xx,&yy); sumX = xx;
sumY = yy;
} sumX /= Ls[LsNo]->Count;
sumY /= Ls[LsNo]->Count; ShowMessage(AnsiString(sumX) " " sumY);
Form1->Image1->Canvas->Pixels[sumX][sumY] = clWhite;
} void __fastcall TForm1::Button1Click(TObject *Sender)
{
Graphics::TBitmap *pBitmap = Image1->Picture->Bitmap; Byte *ptr;
for (int y = 0; y < pBitmap->Height; y )
{
ptr = (Byte *)pBitmap->ScanLine[y];
StatusBar1->SimpleText = y;
for (int x = 0; x < pBitmap->Width; x )
{
//不是白色
if (ptr[3*x]!=0xff||ptr[3*x 1]!=0xff||ptr[3*x 2]!=0xff)
{
x = iBlackDot(x,y,pBitmap->Width,ptr);
}
/*
ptr[3*x] = (Byte)0xff;
ptr[3*x 1] = (Byte)0xff;
ptr[3*x 2] = (Byte)0x00;
*/
}
} Image1->Repaint();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
for (int i=0;i<10;i )
{
Ls[i] = new TStringList();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
for (int i=0;i<10;i )
{
delete Ls[i];
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
for (int i=0;i<10;i )
{
if (Ls[i]->Count)
{
vCalDot(i);
}
} Image1->Repaint();
}
//---------------------------------------------------------------------------
|
residue
中階會員
發表:90 回覆:153 積分:53 註冊:2003-07-02
發送簡訊給我
|
感謝brook大大的指導!! 但小弟找不到下面這行程式的元件,還請大大指教
>
|
JerryKuo
版主
發表:42 回覆:571 積分:322 註冊:2003-03-10
發送簡訊給我
|
引言:
那請問要如何,把圓用不同的顏色圈起來
用snake,這方面要請教MilesWamg
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
引言:StatusBar1->SimpleText = y;
StatusBar這元件在Win32中右邊數來第5個
我是來插花的
|
brook
資深會員
發表:57 回覆:323 積分:371 註冊:2002-07-12
發送簡訊給我
|
引言:
但小弟找不到下面這行程式的元件,還請大大指教
>>>< face="Verdana, Arial, Helvetica"> 這行不重要,只是想看一下y 值而己,可刪掉.
|
residue
中階會員
發表:90 回覆:153 積分:53 註冊:2003-07-02
發送簡訊給我
|
引言:
引言:
但小弟找不到下面這行程式的元件,還請大大指教
>>>< face="Verdana, Arial, Helvetica"> 這行不重要,只是想看一下y 值而己,可刪掉.
感謝brook的回應
但小弟卻出現,以下的誤訊息耶!! 不知是哪出了問題?? 還請指教謝謝!! [
|
brook
資深會員
發表:57 回覆:323 積分:371 註冊:2002-07-12
發送簡訊給我
|
1.我沒動到.h檔
2.vCalDot(int),iBlackDot(int, int, int, unsigned char *)等,按照順序放在
__fastcall TForm1::TForm1(TComponent* Owner) 之前或之後,但一定要在其他function之前.
|
residue
中階會員
發表:90 回覆:153 積分:53 註冊:2003-07-02
發送簡訊給我
|
感謝brook大大的指導
但對於 >
謝謝!!
|
brook
資深會員
發表:57 回覆:323 積分:371 註冊:2002-07-12
發送簡訊給我
|
引言:
1 此程式是基於啥原理去找尋重心呢??
1.先把有相鄰的點分類,存到TStringList裡.
2.只要把每個圓裡(TStringList)的所有點,總合再平均即是重心.
引言:
2 為尋找重心時,重複找兩次便會發生錯誤??
可能要把一些資料(如:TStringList)重新reset吧!
這些小問題你要自己解決,程式不大.
引言:
3 若此程式用來做及時追蹤上,速度方面會有問題嗎??
理論上應該是來不及,而它的瓶頸應該是在掃瞄一張圖花的時間蠻多的,還有TStringList你也可以找其它的替代方案,並減少int轉str所浪費的時間,會比較快一些,但不大可能,能及時處理到每一張圖.
|
residue
中階會員
發表:90 回覆:153 積分:53 註冊:2003-07-02
發送簡訊給我
|
引言:
理論上應該是來不及,而它的瓶頸應該是在掃瞄一張圖花的時間蠻多的,還有TStringList你也可以找其它的替代方案,並減少int轉str所浪費的時間,會比較快一些,但不大可能,能及時處理到每一張圖.
感謝brook大大的指教!!
小弟寫程式的資歷上淺,暫時想不到好的方法改善此事,但時間緊迫,小弟又得麻煩大大囉,請問有那些方案能替代TStringList此法,應朝哪方面去做呢?? 謝謝!!
|
brook
資深會員
發表:57 回覆:323 積分:371 註冊:2002-07-12
發送簡訊給我
|
引言:
小弟寫程式的資歷上淺,暫時想不到好的方法改善此事,但時間緊迫,小弟又得麻煩大大囉,請問有那些方案能替代TStringList此法,應朝哪方面去做呢??
1.TStringList你可用TList來存xy值,bcb有TList使用範例.
2.你的及時追蹤是每秒16張圖嗎?假如是16張圖可能處理不來,是不是可退而求其次,16張圖只處理1張或2張,甚至2秒鐘才處理一張.假如可以,那還有辦法處理,假如不可以,那可能就要再找其他的解決方案,如新增硬體?
|
phorn
一般會員
發表:28 回覆:60 積分:17 註冊:2004-03-03
發送簡訊給我
|
引言:
土法煉鋼,看看合不合用?
//--------------------------------------------------------------------------- #include
#include
#pragma hdrstop #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{ }
//--------------------------------------------------------------------------- TStringList *Ls[10]; void vAddToList(int LsNo,int x,int y,int w)
{
int i;
AnsiString ss;
for (i=0;iAdd(ss);
}
} int iInList(int LsNo,int x,int y,int w)
{
int i,j;
AnsiString ss;
int xx,yy; for (i=Ls[LsNo]->Count-1;i>0;i--)
{
ss = Ls[LsNo]->Strings[i];
sscanf(ss.c_str(),"%d%d",&xx,&yy);
if (yy == y-1)
{
for (j=0;jCount)
{
if (iInList(i,x,y,w)) break;
} else
{
vAddToList(i,x,y,w);
break;
}
}
} int iBlackDot(int x,int y,int w,Byte *ptr)
{
int i;
for (i=0; iCount;i )
{
ss = Ls[LsNo]->Strings[i];
sscanf(ss.c_str(),"%d%d",&xx,&yy); sumX = xx;
sumY = yy;
} sumX /= Ls[LsNo]->Count;
sumY /= Ls[LsNo]->Count; ShowMessage(AnsiString(sumX) " " sumY);
Form1->Image1->Canvas->Pixels[sumX][sumY] = clWhite;
} void __fastcall TForm1::Button1Click(TObject *Sender)
{
Graphics::TBitmap *pBitmap = Image1->Picture->Bitmap; Byte *ptr;
for (int y = 0; y < pBitmap->Height; y )
{
ptr = (Byte *)pBitmap->ScanLine[y];
StatusBar1->SimpleText = y;
for (int x = 0; x < pBitmap->Width; x )
{
//不是白色
if (ptr[3*x]!=0xff||ptr[3*x 1]!=0xff||ptr[3*x 2]!=0xff)
{
x = iBlackDot(x,y,pBitmap->Width,ptr);
}
/*
ptr[3*x] = (Byte)0xff;
ptr[3*x 1] = (Byte)0xff;
ptr[3*x 2] = (Byte)0x00;
*/
}
} Image1->Repaint();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
for (int i=0;i<10;i )
{
Ls[i] = new TStringList();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
for (int i=0;i<10;i )
{
delete Ls[i];
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
for (int i=0;i<10;i )
{
if (Ls[i]->Count)
{
vCalDot(i);
}
} Image1->Repaint();
}
//---------------------------------------------------------------------------
brook您好:
小弟現在正好想寫類似的程式
想了解一下大大是怎麼達成的
大大可否說明一下您程式執行的流程ㄋ?
還又這行是什麼意思可否為我說明一下 謝謝!!
sscanf(ss.c_str(),"%d%d",&xx,&yy);
|
brook
資深會員
發表:57 回覆:323 積分:371 註冊:2002-07-12
發送簡訊給我
|
引言:
sscanf(ss.c_str(),"%d%d",&xx,&yy);
把 AnsiString ss 的值,存到 xx 和 yy;
假如 ss = "200 300";
則結果會是 xx = 200 和 yy = 300;
很基本的指令,用法書上和help上都有. 我想程式不大,只要用單步執行(F4,F7,F8鍵)追蹤一下就知道了.
|