鏈碼問題 |
答題得分者是:syntax
|
913028
一般會員 發表:30 回覆:41 積分:19 註冊:2008-06-24 發送簡訊給我 |
各位大大你們好:
我修改此程式出現如圖之情形,不知是為何麻煩大大們幫我看看。 此程式為 wayne_di 大大所分享=> http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=95074 修改程式碼為如圖下方: [code cpp] void __fastcall TForm1::Button19Click(TObject *Sender) //=>使用一按鍵執行 { /*原始程式宣告解釋: 圖檔大小皆為長90,寬46 Wayne.bgr[ ][ ]←這個是我做完二值化會將圖資料存入此矩陣 =>這我把它改成image03_Gray buf[ ] [ ] ←大小為90*46 將他預設成1, 如果已經處理過的位置把它變成0,防止重複編碼 =>這我把它改成640*480 Wayne.chaincode←記錄編碼的號碼 =>這的意思不太了解,不知如何改,所以用雙斜線跳過 我掃描方向為順時針 上→右上→右→右下→下→左下→左→左上 由上述的方向依照她的方向給他標號 0→1→2→3→4→5→6→7 */ //=================================== int x,Chain_i,Chain_j,check; //記錄存儲位置 起始位置 上一點 現在位置 int exit,run; //離開迴圈的旗標 和 是否有直行過的旗標 int buf[640][480]; //記路標過的點位置 x=0;exit=0;run=0;check=0; //初始值設定 Memo1->Lines->Clear(); //TXT5 = "";//=>不知為何用途所以用斜線跳過了 Image2->Picture->Bitmap->PixelFormat = (TPixelFormat)6; //將buf裡面全部放一 當有記錄過的位置 則轉變成0 故只要buf[][]==0的地方就不要執行 for(int i=0;i for(int j=0;j buf[i][j]=255; /* i-1,j-1 | i-1,j | i-1,j 1 7 | 0 | 1 ----------------------- --------- i ,j-1 | i ,j | i ,j 1 6 | | 2 ----------------------- --------- i 1,j-1 | i 1,j | i 1,j 1 5 | 4 | 3 */ for(int i=1;i<479 && exit!=1;i ) //exit=1十 表示已執行完輪廓編碼 { for(int j=1;j<639 && exit!=1;j ) { if(image03_Gray[i][j]==255)//找到陣列的第一個黑點 { Chain_i=i; Chain_j=j; buf[Chain_i][Chain_j]=0; int position=0; //position=0 為由0 開 始 的 順 時 針 方 向 收 尋 //position=1 為由4開始的順時針方向收尋=>此行我已刪除 //找到點 且確認八方有黑點 這樣才能繼續下去 while(~((image03_Gray[Chain_i-1][Chain_j-1]!=0) && (image03_Gray[Chain_i-1][Chain_j]!=0) && (image03_Gray[Chain_i-1][Chain_j 1]!=0) &&(image03_Gray[Chain_i][Chain_j-1]!=0) && (image03_Gray[Chain_i][Chain_j 1]!=0) &&(image03_Gray[Chain_i 1][Chain_j-1]!=0) && (image03_Gray[Chain_i 1][Chain_j]!=0) && (image03_Gray[Chain_i 1][Chain_j 1]!=0)) && check==0) //check=0 表示已經無下一點可編碼 { run=1; //編碼規則 1.找出下一點的方向 2.不能是上一點 3.確認是否繞一圈 if(position==0) { if(image03_Gray[Chain_i-1][Chain_j]==0 && buf[Chain_i-1][Chain_j]==255 ) //上 0 { // Wayne.chaincode[x]=0; //記錄編碼 buf[Chain_i][Chain_j]=0; //標記以編碼的位置 x ; Chain_i=Chain_i-1; //以下一個方向當起點 Chain_j=Chain_j; position=0; //還是以0開始的順時針編碼 } else if(image03_Gray[Chain_i-1][Chain_j 1]==0 && buf[Chain_i-1][Chain_j 1]==255 ) //右上 1 { //Wayne.chaincode[x]=1; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i-1; Chain_j=Chain_j 1; position=0; } else if(image03_Gray[Chain_i][Chain_j 1]==0 && buf[Chain_i][Chain_j 1]==255 ) //右 2 { //Wayne.chaincode[x]=2; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i; Chain_j=Chain_j 1; position=0; } else if(image03_Gray[Chain_i 1][Chain_j 1]==0 && buf[Chain_i 1][Chain_j 1]==255 ) //右下 3 { //Wayne.chaincode[x]=3; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i 1; Chain_j=Chain_j 1; position=0; } else if(image03_Gray[Chain_i 1][Chain_j]==0 && buf[Chain_i 1][Chain_j]==255 ) //下 4 { //Wayne.chaincode[x]=4; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i 1; Chain_j=Chain_j; position=1; } else if(image03_Gray[Chain_i 1][Chain_j-1]==0 && buf[Chain_i 1][Chain_j-1]==255 ) //左下 5 { //Wayne.chaincode[x]=5; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i 1; Chain_j=Chain_j-1; position=1; } else if(image03_Gray[Chain_i][Chain_j-1]==0 && buf[Chain_i][Chain_j-1]==255 ) //左 6 { //Wayne.chaincode[x]=6; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i; Chain_j=Chain_j-1; position=1; } else if(image03_Gray[Chain_i-1][Chain_j-1]==0 && buf[Chain_i-1][Chain_j-1]==255 ) //右上 7 { //Wayne.chaincode[x]=7; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i-1; Chain_j=Chain_j-1; position=1; } else check=1; } else{ if(image03_Gray[Chain_i 1][Chain_j]==0 && buf[Chain_i 1][Chain_j]==255 ) //下 4 { //Wayne.chaincode[x]=4; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i 1; Chain_j=Chain_j; position=1; } else if(image03_Gray[Chain_i 1][Chain_j-1]==0 && buf[Chain_i 1][Chain_j-1]==255 ) //左下 5 { // Wayne.chaincode[x]=5; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i 1; Chain_j=Chain_j-1; position=1; } else if(image03_Gray[Chain_i][Chain_j-1]==0 && buf[Chain_i][Chain_j-1]==255 ) //左 6 { //Wayne.chaincode[x]=6; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i; Chain_j=Chain_j-1; position=1; } else if(image03_Gray[Chain_i-1][Chain_j-1]==0 && buf[Chain_i-1][Chain_j-1]==255 ) //右上 7 { //Wayne.chaincode[x]=7; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i-1; Chain_j=Chain_j-1; position=1; } else if(image03_Gray[Chain_i-1][Chain_j]==0 && buf[Chain_i-1][Chain_j]==255 ) //上 0 { //Wayne.chaincode[x]=0; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i-1; Chain_j=Chain_j; position=0; } else if(image03_Gray[Chain_i-1][Chain_j 1]==0 && buf[Chain_i-1][Chain_j 1]==255 ) //右上 1 { //Wayne.chaincode[x]=1; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i-1; Chain_j=Chain_j 1; position=0; } else if(image03_Gray[Chain_i][Chain_j 1]==0 && buf[Chain_i][Chain_j 1]==255 ) //右 2 { // Wayne.chaincode[x]=2; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i; Chain_j=Chain_j 1; position=0; } else if(image03_Gray[Chain_i 1][Chain_j 1]==0 && buf[Chain_i 1][Chain_j 1]==255 ) //右下 3 { //Wayne.chaincode[x]=3; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i 1; Chain_j=Chain_j 1; position=0; } else check=1; } } if(run==1) exit=1; } } } } [/code] 此程式我是要用在尋找640*480裡的白色方型輪廓,煩請各位大大們幫我看看 到底是哪裡錯誤了。 PS:有顏色字型的也煩請各位大大 詳解 "在此先說聲謝謝"
------
新手報到 |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
===================引 用 913028 文 章=================== 各位大大你們好: 我修改此程式出現如圖之情形,不知是為何麻煩大大們幫我看看。 此程式為 wayne_di 大大所分享=> http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=95074 修改程式碼為如圖下方: [code cpp] void __fastcall TForm1::Button19Click(TObject *Sender) //=>使用一按鍵執行 { /*原始程式宣告解釋: 圖檔大小皆為長90,寬46 Wayne.bgr[ ][ ]←這個是我做完二值化會將圖資料存入此矩陣 =>這我把它改成image03_Gray buf[ ] [ ] ←大小為90*46 將他預設成1, 如果已經處理過的位置把它變成0,防止重複編碼 =>這我把它改成640*480 Wayne.chaincode←記錄編碼的號碼 =>這的意思不太了解,不知如何改,所以用雙斜線跳過 我掃描方向為順時針 上→右上→右→右下→下→左下→左→左上 由上述的方向依照她的方向給他標號 0→1→2→3→4→5→6→7 */ //=================================== int x,Chain_i,Chain_j,check; //記錄存儲位置 起始位置 上一點 現在位置 int exit,run; //離開迴圈的旗標 和 是否有直行過的旗標 int buf[640][480]; //記路標過的點位置 x=0;exit=0;run=0;check=0; //初始值設定 Memo1->Lines->Clear(); //TXT5 = "";//=>不知為何用途所以用斜線跳過了 Image2->Picture->Bitmap->PixelFormat = (TPixelFormat)6; //將buf裡面全部放一 當有記錄過的位置 則轉變成0 故只要buf[][]==0的地方就不要執行 for(int i=0;i //position=1 為由4開始的順時針方向收尋=>此行我已刪除 //找到點 且確認八方有黑點 這樣才能繼續下去 while(~((image03_Gray[Chain_i-1][Chain_j-1]!=0) && (image03_Gray[Chain_i-1][Chain_j]!=0) && (image03_Gray[Chain_i-1][Chain_j 1]!=0) &&(image03_Gray[Chain_i][Chain_j-1]!=0) && (image03_Gray[Chain_i][Chain_j 1]!=0) &&(image03_Gray[Chain_i 1][Chain_j-1]!=0) && (image03_Gray[Chain_i 1][Chain_j]!=0) && (image03_Gray[Chain_i 1][Chain_j 1]!=0)) && check==0) //check=0 表示已經無下一點可編碼 { run=1; //編碼規則 1.找出下一點的方向 2.不能是上一點 3.確認是否繞一圈 if(position==0) { if(image03_Gray[Chain_i-1][Chain_j]==0 && buf[Chain_i-1][Chain_j]==255 ) //上 0 { // Wayne.chaincode[x]=0; //記錄編碼 buf[Chain_i][Chain_j]=0; //標記以編碼的位置 x ; Chain_i=Chain_i-1; //以下一個方向當起點 Chain_j=Chain_j; position=0; //還是以0開始的順時針編碼 } else if(image03_Gray[Chain_i-1][Chain_j 1]==0 && buf[Chain_i-1][Chain_j 1]==255 ) //右上 1 { //Wayne.chaincode[x]=1; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i-1; Chain_j=Chain_j 1; position=0; } else if(image03_Gray[Chain_i][Chain_j 1]==0 && buf[Chain_i][Chain_j 1]==255 ) //右 2 { //Wayne.chaincode[x]=2; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i; Chain_j=Chain_j 1; position=0; } else if(image03_Gray[Chain_i 1][Chain_j 1]==0 && buf[Chain_i 1][Chain_j 1]==255 ) //右下 3 { //Wayne.chaincode[x]=3; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i 1; Chain_j=Chain_j 1; position=0; } else if(image03_Gray[Chain_i 1][Chain_j]==0 && buf[Chain_i 1][Chain_j]==255 ) //下 4 { //Wayne.chaincode[x]=4; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i 1; Chain_j=Chain_j; position=1; } else if(image03_Gray[Chain_i 1][Chain_j-1]==0 && buf[Chain_i 1][Chain_j-1]==255 ) //左下 5 { //Wayne.chaincode[x]=5; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i 1; Chain_j=Chain_j-1; position=1; } else if(image03_Gray[Chain_i][Chain_j-1]==0 && buf[Chain_i][Chain_j-1]==255 ) //左 6 { //Wayne.chaincode[x]=6; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i; Chain_j=Chain_j-1; position=1; } else if(image03_Gray[Chain_i-1][Chain_j-1]==0 && buf[Chain_i-1][Chain_j-1]==255 ) //右上 7 { //Wayne.chaincode[x]=7; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i-1; Chain_j=Chain_j-1; position=1; } else check=1; } else{ if(image03_Gray[Chain_i 1][Chain_j]==0 && buf[Chain_i 1][Chain_j]==255 ) //下 4 { //Wayne.chaincode[x]=4; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i 1; Chain_j=Chain_j; position=1; } else if(image03_Gray[Chain_i 1][Chain_j-1]==0 && buf[Chain_i 1][Chain_j-1]==255 ) //左下 5 { // Wayne.chaincode[x]=5; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i 1; Chain_j=Chain_j-1; position=1; } else if(image03_Gray[Chain_i][Chain_j-1]==0 && buf[Chain_i][Chain_j-1]==255 ) //左 6 { //Wayne.chaincode[x]=6; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i; Chain_j=Chain_j-1; position=1; } else if(image03_Gray[Chain_i-1][Chain_j-1]==0 && buf[Chain_i-1][Chain_j-1]==255 ) //右上 7 { //Wayne.chaincode[x]=7; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i-1; Chain_j=Chain_j-1; position=1; } else if(image03_Gray[Chain_i-1][Chain_j]==0 && buf[Chain_i-1][Chain_j]==255 ) //上 0 { //Wayne.chaincode[x]=0; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i-1; Chain_j=Chain_j; position=0; } else if(image03_Gray[Chain_i-1][Chain_j 1]==0 && buf[Chain_i-1][Chain_j 1]==255 ) //右上 1 { //Wayne.chaincode[x]=1; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i-1; Chain_j=Chain_j 1; position=0; } else if(image03_Gray[Chain_i][Chain_j 1]==0 && buf[Chain_i][Chain_j 1]==255 ) //右 2 { // Wayne.chaincode[x]=2; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i; Chain_j=Chain_j 1; position=0; } else if(image03_Gray[Chain_i 1][Chain_j 1]==0 && buf[Chain_i 1][Chain_j 1]==255 ) //右下 3 { //Wayne.chaincode[x]=3; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i 1; Chain_j=Chain_j 1; position=0; } else check=1; } } if(run==1) exit=1; } } } } [/code] 此程式我是要用在尋找640*480裡的白色方型輪廓,煩請各位大大們幫我看看 到底是哪裡錯誤了。 PS:有顏色字型的也煩請各位大大 詳解 "在此先說聲謝謝" |
913028
一般會員 發表:30 回覆:41 積分:19 註冊:2008-06-24 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |