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

求出物體的中心位置

答題得分者是:pcboy
z9278170
一般會員


發表:5
回覆:8
積分:2
註冊:2007-06-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-09-07 13:41:27 IP:140.118.xxx.xxx 訂閱
假設我有一張圖片大小為100*100,x和y50-70為紅色,其他為白色,我要求出這個紅色物件的中心位置,程式碼如下:想請問各位大大,我這樣的寫法可行嗎?還有一個問題就是,理論來說當i跑到50時,就可以算出中心位置了,但是i還是會繼續跑,這以會很浪費我的運算速度,而且感覺結果就會錯了,要怎麼解決呢?麻煩各位大大了
(其中xseat、 yseat、 count1、count2皆為全域變數
<textarea class="cpp" rows="10" cols="60" name="code">for(i=0;i<=100;i ) { for(j=0;j<100;j ) { if (R(i,j)==255&& G(i,j)==0 && B(i,j)==0) //RGB代表色彩色模型 { connect1(i,j); connect2(i,j); connect3(i,j); connect4(i,j); } } } xcenter=xseat/count1; //xcenter代表物件中心的x座標值, xseat表物件的x座標值,count1計數次數 ycenter=yseat/count2; //ycenter代表物件中心的x座標值,yseat表物件的x座標值,count2計數次數 void connect1(int ii,int jj) { xseat=ii; count1 =1; //判斷 (x 1,y) if (R(ii 1,,jj)==255&& G(ii 1,j,j)==0 && B(ii 1,j,j)==0) connect1(ii 1,,jj); } void connect2(int ii,int jj) { xseat=ii; count1 =1; //判斷 (x-1,y) if (R(ii-1,,jj)==255&& G(ii-1,j,j)==0 && B(ii-1,j,j)==0) connect2(ii-1,jj); } void connect3(int ii,int jj) { yseat=jj; count2 =1; //判斷 (x,y 1) if (R(ii,,jj 1)==255&& G(ii,j,j 1)==0 && B(ii,j,j 1)==0) connect3(ii,jj 1); } void connect4(int ii,int jj) { yseat=jj; count2 =1; //判斷 (x,y-1) if (R(ii,,jj-1)==255&& G(ii,j,j-1)==0 && B(ii,,j,j-1)==0) connect4(ii,jj-1); } </textarea>
編輯記錄
yckuo 重新編輯於 2007-09-10 15:01:23, 註解 無‧
yckuo 重新編輯於 2007-09-10 15:19:43, 註解 無‧
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-09-10 08:53:14 IP:220.134.xxx.xxx 訂閱
以下是假設您的物體是方形所作尋找物件左上/右下座標的方式,請參考。

<textarea class="cpp" rows="10" cols="60" name="code">int i,j,w,h; int oLeft,oTop,oRight,oBottom; int centerX,centerY; bool ObjectFound=false; for(i=0;i<100;i ) { for(j=0;j<100;j ) { if (R(i,j)==255 && G(i,j)==0 && B(i,j)==0) //RGB代表色彩色模型 { // 找到左上角(起點) ObjectFound=true; oLeft=i; oTop=j; for(w=i 1;w<100;w ) // 向右找 { if(R(w,j)==255 && G(w,j)==0 && B(w,j)==0) //RGB代表色彩色模型 continue; // 還是物件點, 繼續找 else break; // 不再是物件點, 結束尋找 } oRight=w-1; for(h=j 1;h<100;h ) // 向下找 { if(R(i,h)==255 && G(i,h)==0 && B(i,h)==0) //RGB代表色彩色模型 continue; // 還是物件點, 繼續找 else break; // 不再是物件點, 結束尋找 } oBottom=h-1; break; // 只找一個物件, 己找到, 可以結束尋找了 } } } if(ObjectFound) // 有找到才能算中心 { centerX=(oLeft oRight)/2; centerY=(oTop oBottom)/2; } else { ShowMessage("找不到!!"); } </textarea>
------
http://www.ViewMove.com
編輯記錄
yckuo 重新編輯於 2007-09-10 14:59:43, 註解 套用程式碼編輯,以避免逗點被瀏覽器自動消失.‧
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-09-10 09:24:35 IP:61.220.xxx.xxx 訂閱
看不懂程式邏輯
你的connect1,connect2,connect3,connect4好像是在找相鄰的紅點
和找紅色物體中心有甚麼關係
中心 = (所有紅點 X 座標 / 所有紅點數, 所有紅點 Y 座標 / 所有紅點數) 
只要有雙迴圈就好, 而且 既然紅點只會出現在 50-70 的座標
i 和 j 只要從 50 到 70 就好 
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
z9278170
一般會員


發表:5
回覆:8
積分:2
註冊:2007-06-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-09-10 10:17:03 IP:140.118.xxx.xxx 訂閱
謝謝各位大大的回應
我的程式主要是先找到紅色物體的其中一點,然後向上下左右繼續找就可以到到縱向的所有x座標值,然後再把所有x值加起來,除以個數就可以算出中心了啊!50-70只是假設的位置,物體可能出現在任何地方
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-09-10 11:31:28 IP:210.241.xxx.xxx 訂閱
您的程式邏輯和程式寫法根本不符合
您在雙回圈中每個點已經計算過一次, 結果您又對每個點的相鄰點又計算一次
結果回重複計算

建議您用簡單的雙回圈處理就好
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
z9278170
一般會員


發表:5
回覆:8
積分:2
註冊:2007-06-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-09-10 12:38:17 IP:140.118.xxx.xxx 訂閱
謝謝pcbob 版主的指導!
請問一下dlleed站務副站長
關於你的程式,我有一個疑問,因為我要做的是動態影像,所以萬一找到的第一點是雜訊的話,而且剛合符合IF條件的要求的話,那 oLeft 跟oTop不就變成是雜訊了嗎,真正的物體不就找不到了嗎?
麻煩你們了
謝謝
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-09-10 14:48:58 IP:61.220.xxx.xxx 訂閱
dllee 是假設 "物體一定是方形,那只要找出左上角及右下角的座標即可。"
> 因為我要做的是動態影像,所以萬一找到的第一點是雜訊的話,而且剛合符合IF條件的要求的話,那 oLeft 跟oTop不就變成是雜訊了嗎,真正的物體不就找不到了嗎?
您又蹦出了雜訊問題, 那當然dllee兄的方法未必合適
能盡量說清狀況嗎?
您是用 WebCam 或 DV 拍攝物體, 要找出物體中心 ?
紅色物體是單一物體 ? 還是一個物體可能有好幾個分離的紅色部分 ?
或者甚至有多個物體 ?



------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
z9278170
一般會員


發表:5
回覆:8
積分:2
註冊:2007-06-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-09-10 16:33:34 IP:140.118.xxx.xxx 訂閱
沒錯!是用攝影機,主要是一個紅色物體。
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-09-10 16:48:05 IP:210.241.xxx.xxx 訂閱
誤判少數幾點沒關係, 因為物體的點數很多, 程式如下

<textarea class="cpp" rows="10" cols="60" name="code">xtotal=0; ytotal=0; count=0; for(i=0;i<=100;i ) { for(j=0;j<100;j ) { if (R(i,j)==255&& G(i,j)==0 && B(i,j)==0) //RGB代表色彩色模型 { xtotal=xtotal i; ytotal=ytotal j; count=count 1; } } } xcenter=xtotal/count; //xcenter代表物件中心的x座標值 ycenter=ytotal/count; //ycenter代表物件中心的y座標值 </textarea>
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
z9278170
一般會員


發表:5
回覆:8
積分:2
註冊:2007-06-24

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-09-10 17:35:09 IP:140.118.xxx.xxx 訂閱
謝謝pcoby
理論來說當i跑到50時,就可以算出中心位置了,但是i還是會繼續跑,這會很浪費我的運算速度,要怎麼解決呢?麻煩各位大大了
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-09-10 20:31:20 IP:59.105.xxx.xxx 訂閱
您一直提到「理論來說當i跑到50時,就可以算出中心位置了
請問一下,您用的是什麼理論呢?
以 pcboy #9 的作法,已經是把問題解決了喔。
您之後強調,可能有雜訊,又物體可能會動等等,這樣就只有用 pcboy #9 的方法才能解。
您一直提的跑到 50 就算出來,那是您的「人工智慧」判斷,而不是電腦程式的判斷,
請您不要搞混了。
要電腦作計算或要偵測,必需要有前題及假設,如果您要把它套用到與前題/假設不符的狀況,
那它自然是無法處理,同時您的前題及假設也必需與現況相符,否則,前題及假設都是錯的了,
按此前題及假設作出來的程式自然是無法運作的。
------
http://www.ViewMove.com
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-09-10 22:56:18 IP:203.204.xxx.xxx 訂閱
如果您有100%把i到50就可以算出中心位置, 那就把
for(i=0;i<=100;i  )
改為
for(i=0;i<=50;i  )
但是小弟也很好奇您根據什麼理由?
那個紅色物體只會出現在畫面左半邊嗎?
如果這樣 WebCam 不需要 100x100, 只要50x100 解析度就夠了
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
z9278170
一般會員


發表:5
回覆:8
積分:2
註冊:2007-06-24

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-09-12 13:11:14 IP:140.118.xxx.xxx 訂閱
謝謝pcboy和dlleep我懂了,真的非常感謝你們兩位,謝謝
系統時間:2024-12-04 16:42:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!