2013-10-29 36 views
0

我想用霍夫變換在二值圖像中檢測一個圓。霍夫變換:通過OpenCL提高算法效率

當我使用Opencv的循環Hough變換的內置函數時,它是可以的,我可以找到圓。

現在我試着寫我自己的「內核」的代碼做Hough變換,但非常非常慢:

kernel void hough_circle(read_only image2d_t imageIn, global int* in,const int w_hough,__global int * circle) 
{ 
    sampler_t sampler=CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST; 
    int gid0 = get_global_id(0); 
    int gid1 = get_global_id(1); 
    uint4 pixel; 
    int x0=0,y0=0,r; 
    int maxval=0; 
    pixel=read_imageui(imageIn,sampler,(int2)(gid0,gid1)); 
    if(pixel.x==255) 
    { 
    for(int r=20;r<150;r+=2) 
    { 
    // int r=100; 

       for(int theta=0; theta<360;theta+=2) 
       { 

           x0=(int) round(gid0-r*cos((float) radians((float) theta))); 
          y0=(int) round(gid1-r*sin((float) radians((float) theta))); 
          if((x0>0) && (x0<get_global_size(0)) && (y0>0)&&(y0<get_global_size(1))) 
          atom_inc(&in[w_hough*y0+x0]); 
       } 
       if(maxval<in[w_hough*y0+x0]) 
       { 
       maxval=in[w_hough*y0+x0]; 
       circle[0]=gid0; 
       circle[1]=gid1; 
       circle[2]=r; 
       } 

       } 

    } 

} 

有與Op​​enCV的霍夫的OpenCL庫的源代碼,但它很難我提取幫助我的特定功能。

任何人都可以提供一個更好的源代碼示例,或幫助我理解爲什麼這是如此低效? 代碼的main.cpp和RAR文件http://www.files.com/set/527152684017e用於讀取和顯示圖像>

+0

請添加指向現有源代碼的鏈接,例如OpenCL庫或其他。請同時提供您的基準,以便人們可以瞭解您已經完成了哪些工作。 –

回答

1

重複調用 使用的OpenCV LIB kernel.cl壓縮到sin()cos()是計算昂貴的。既然你只用這些函數調用相同的180個值theta,你可以通過預先計算這些值並將它們存儲在一個數組中來加快速度。

更強大的方法是使用midpoint circle algorithm通過簡單的整數算術來找到這些圓的周長。

+0

謝謝你的幫助。 sin和cos用數組__constant float sin_parameter [360] = {0.00000,0.01745,0.03490,.....}替換,另一個用於cos,但執行速度也很慢。 我使用opencv的默認功能繪製中心和半徑的圓放置參數cvcircle – user2933632

0

你在做什麼只是在一個工作項目中運行一個巨大的CPU代碼塊,結果如預期的那樣是一個slowww內核。

詳細回答: 唯一的地方是你使用的工作項目ID只是像素值,如果滿足條件,那麼你運行一大塊代碼。一些工作項目會觸發這些,其中一些不會。觸發它的那些將間接地讓所有的工作組運行該代碼,這會減慢你的速度。

此外,不輸入該條件的工作項將閒置。根據圖像可能有99%是空閒的。

我會重寫你的算法使用每個像素1個工作組。 如果條件滿足,工作組將運行該算法,否則整個工作組將跳過。而在工作組進入條件的情況下,您將有許多工作項目可供使用。這將允許重新設計代碼,以便內部for循環並行運行。

+0

謝謝。 iam new in opencl,在主程序中定義global_group_size和local_group_size全局等於圖像的大小尺寸和local = 8。內核代碼在所有工作項目上運行???怎麼能知道?如果它只運行一個工作項目而其他項目閒置,則利用率不會達到99%。 是任何暗示優化內核的代碼 再次感謝你.so我的壞英文 代碼是在這裏main.cpp和內核在rar文件http://www.files.com/set/527152684017e 對不起我的英語不好 – user2933632