出現Scanline out of range該如何解決 |
尚未結案
|
wbs173
一般會員 發表:12 回覆:26 積分:7 註冊:2005-03-15 發送簡訊給我 |
我在我的Timer裡面加入了以下的程式碼 但在compile時卻出現了Scanline out of range這個警告訊號 雖然跳過可以用 但是我想把她解決 我爬過了許多相關的文章 但卻還是不能解決 請會的高手幫個忙 程式有點長 麻煩多費心了
感激不盡~!
void __fastcall TForm1::Timer3Timer(TObject *Sender)
{
// 統計水平與垂直方向的投影量
long ProjectV[320] = {0};
long ProjectH[240] = {0};
long Vmax = 0, Hmax = 0;
Byte *ptr;
StringGrid1->Cells[0][1]="垂直";
StringGrid1->Cells[0][2]="水平";
Image3->Canvas->Brush->Color = clWhite;
Image3->Canvas->FillRect(TRect(0,0,Image3->Width,Image3->Height));
Image4->Canvas->Brush->Color = clWhite;
Image4->Canvas->FillRect(TRect(0,0,Image4->Width,Image4->Height));
for(int row = 0; row < 240; row )
{
ptr = (Byte *)Image2->Picture->Bitmap->ScanLine[row];
for(int col = 0; col < 320; col )
{
if(col == 0)
StringGrid1->Cells[0][col]="行(列)數";//設定StringGrid中最左上角那一小格的資訊
else StringGrid1->Cells[col][0]=IntToStr(col);//col header的值
if(ptr[col*3] == 0) // 黑點
{
ProjectV[col] ; // 垂直方向投影的數量 1
ProjectH[row] ; // 水平方向投影的數量 1
if(ProjectV[col] > Vmax)
Vmax = ProjectV[col]; // 統計垂直投影最大值
if(ProjectH[row] > Hmax)
Hmax = ProjectH[row]; // 統計水平投影最大值
}
}
}
// 畫出水平方向投影
Image3->Canvas->Pen->Color = clBlack;
for(int row = 1; row <= 240; row )
{
StringGrid1->Cells[row][2]=IntToStr(ProjectH[row]);//輸出水平方向的加總值
Image3->Canvas->MoveTo(Image3->Width, row);
Image3->Canvas->LineTo(Image3->Width * (1.0 - (double)ProjectH[row] / (double)Hmax), row);
} // 畫出垂直方向投影
Image4->Canvas->Pen->Color = clBlack;
for(int col = 1; col <= 320; col )
{
StringGrid1->Cells[col][1]=IntToStr(ProjectV[col]);//輸出垂直方向的加總值
Image4->Canvas->MoveTo(col, Image4->Height);
Image4->Canvas->LineTo(col, Image4->Height * (1.0 - (double)ProjectV[col] / (double)Vmax));
}
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
wbs173 您好: 您的程式碼排版沒有縮排,看起來很吃力,因此尚未仔細查看您的程式碼,我僅查看了 ScanLine 這個動作的前後敘述,發現您在程式內設定的幾個值都是固定為 320 或 240,那麼您是否已經確定了您處理的 Image2 的圖像尺寸一定是固定的 240x320,而不會有其它更小的尺寸呢?另外在程式中有兩處作到除法運算,而往前追朔查看被除的 Hmax 與 Vmax 時,可以發現若是圖像上沒有黑點的話這兩個變數會是 0,這將可能導致錯誤的發生。 發表人 - RedSnow 於 2005/04/06 22:32:47
|
wbs173
一般會員 發表:12 回覆:26 積分:7 註冊:2005-03-15 發送簡訊給我 |
抱歉喔 我第一次貼程式碼上來 所以不會貼 再貼一次這樣不知道對不對
taishyang 大大的方法我爬文時試過了 但是還是一樣 我的圖示從CCD擷取的 大小應該固定吧 所以還麻煩會的高手幫忙看看 感恩~
void __fastcall TForm1::Timer3Timer(TObject *Sender) { // 統計水平與垂直方向的投影量 long ProjectV[320] = {0}; long ProjectH[240] = {0}; long Vmax = 0, Hmax = 0; Byte *ptr; StringGrid1->Cells[0][1]="垂直"; StringGrid1->Cells[0][2]="水平"; Image3->Canvas->Brush->Color = clWhite; Image3->Canvas->FillRect(TRect(0,0,Image3->Width,Image3->Height)); Image4->Canvas->Brush->Color = clWhite; Image4->Canvas->FillRect(TRect(0,0,Image4->Width,Image4->Height)); for(int row = 0; row < 240; row ) { ptr = (Byte *)Image2->Picture->Bitmap->ScanLine[row]; for(int col = 0; col < 320; col ) { if(col == 0) StringGrid1->Cells[0][col]="行(列)數";//設定StringGrid中最左上角那一小格的資訊 else StringGrid1->Cells[col][0]=IntToStr(col);//col header的值 if(ptr[col*3] == 0) // 黑點 { ProjectV[col] ; // 垂直方向投影的數量 1 ProjectH[row] ; // 水平方向投影的數量 1 if(ProjectV[col] > Vmax) Vmax = ProjectV[col]; // 統計垂直投影最大值 if(ProjectH[row] > Hmax) Hmax = ProjectH[row]; // 統計水平投影最大值 }}} // 畫出水平方向投影 Image3->Canvas->Pen->Color = clBlack; for(int row = 1; row <= 240; row ) { StringGrid1->Cells[row][2]=IntToStr(ProjectH[row]);//輸出水平方向的加總值 Image3->Canvas->MoveTo(Image3->Width, row); Image3->Canvas->LineTo(Image3->Width * (1.0 - (double)ProjectH[row] / (double)Hmax), row); } // 畫出垂直方向投影 Image4->Canvas->Pen->Color = clBlack; for(int col = 1; col <= 320; col ) { StringGrid1->Cells[col][1]=IntToStr(ProjectV[col]);//輸出垂直方向的加總值 Image4->Canvas->MoveTo(col, Image4->Height); Image4->Canvas->LineTo(col, Image4->Height * (1.0 - (double)ProjectV[col] / (double)Vmax)); } |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
您好:
我用您的程式碼測試並不會有您說的現象耶,BCB6.0 WinNT
會不會是其他地方的問題?
long ProjectV[320] = {0}; long ProjectH[240] = {0}; long Vmax = 0, Hmax = 0; Byte *ptr; StringGrid1->Cells[0][1]="垂直"; StringGrid1->Cells[0][2]="水平"; Image3->Canvas->Brush->Color = clWhite; Image3->Canvas->FillRect(TRect(0,0,Image3->Width,Image3->Height)); Image4->Canvas->Brush->Color = clWhite; Image4->Canvas->FillRect(TRect(0,0,Image4->Width,Image4->Height)); for(int row = 0; row < 240; row ) { ptr = (Byte *)Image2->Picture->Bitmap->ScanLine[row]; for(int col = 0; col < 320; col ) { if(col == 0) StringGrid1->Cells[0][col]="行(列)數";//設定StringGrid中最左上角那一小格的資訊 else StringGrid1->Cells[col][0]=IntToStr(col);//col header的值 if(ptr[col*3] == 0) // 黑點 { ProjectV[col] ; // 垂直方向投影的數量 1 ProjectH[row] ; // 水平方向投影的數量 1 if(ProjectV[col] > Vmax) Vmax = ProjectV[col]; // 統計垂直投影最大值 if(ProjectH[row] > Hmax) Hmax = ProjectH[row]; // 統計水平投影最大值 } } } // 畫出水平方向投影 Image3->Canvas->Pen->Color = clBlack; for(int row = 1; row <= 240; row ) { StringGrid1->Cells[row][2]=IntToStr(ProjectH[row]);//輸出水平方向的加總值 Image3->Canvas->MoveTo(Image3->Width, row); Image3->Canvas->LineTo(Image3->Width * (1.0 - (double)ProjectH[row] / (double)Hmax), row); } // 畫出垂直方向投影 Image4->Canvas->Pen->Color = clBlack; for(int col = 1; col <= 320; col ) { StringGrid1->Cells[col][1]=IntToStr(ProjectV[col]);//輸出垂直方向的加總值 Image4->Canvas->MoveTo(col, Image4->Height); Image4->Canvas->LineTo(col, Image4->Height * (1.0 - (double)ProjectV[col] / (double)Vmax)); }順心 |
wbs173
一般會員 發表:12 回覆:26 積分:7 註冊:2005-03-15 發送簡訊給我 |
非常感謝taishyang大大 費心看我的程式碼還幫忙RUN 我不知道是哪裡有錯 我貼上我全部的程式好了 希望各位高手不厭其煩幫我看看 感激不盡~
//--------------------------------------------------------------------------- #include |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
wbs173
一般會員 發表:12 回覆:26 積分:7 註冊:2005-03-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |