2013-10-22 77 views
0

我想找到一個模糊圖像的角落裏面有一個角落。像下面的例子:如何使用opencv查找模糊角落位置?

Blurred image example

我可以確保只有一個角是圖像裏面,我認爲

角落是黑色和白色棋盤的一部分。

如何使用openCV檢測交叉位置? 謝謝!

+0

使用閾值函數來獲得唯一的二進制圖像,比CornerHarris找到角落 – Engine

回答

0

一般可以使用梯度確定的角:

的Gx = IM [i] [j + 1] - IM [i] [j-1]; Gy = im [i + 1] [j] - im [i-1] [j];

G^2 = Gx^2 + Gy^2;

teta = atan2(Gy,Gx);

作爲你的圖像模糊,則應該計算梯度以更大的比例:

的Gx = IM [i] [j +增量] - IM [i] [j-Δ]; Gy = im [i + delta] [j] - im [i-delta] [j];

這裏是我爲增量= 50所獲得的結果:

的梯度範數(乘以20)

gradient norm http://imageshack.us/scaled/thumb/822/xdpp.jpg

梯度方向:

gradient direction http://imageshack.us/scaled/thumb/844/h6zp.jpg

0

另一種解決方案

enter image description here

#include <opencv2/opencv.hpp> 

using namespace cv; 
int main() 
{ 

    Mat img=imread("c:/data/corner.jpg"); 
    Mat gray; 
    cvtColor(img,gray,CV_BGR2GRAY); 
    threshold(gray,gray,100,255,CV_THRESH_BINARY); 
    int step=15; 
    std::vector<Point> points; 
    for(int i=0;i<gray.rows;i+=step) 
     for(int j=0;j<gray.cols;j+=step) 
      if(gray.at<uchar>(i,j)==255)    
       points.push_back(Point(j,i)); 

    //fit a rotated rectangle 

    RotatedRect box = minAreaRect(Mat(points)); 
    //circle(img,box.center,2,Scalar(255,0,0),-1); 

    //invert it,fit again and get average of centers(may not be needed if a 'good' threshold is found) 
    Point p1=Point(box.center.x,box.center.y); 
    points.clear(); 
    gray=255-gray; 
    for(int i=0;i<gray.rows;i+=step) 
     for(int j=0;j<gray.cols;j+=step) 
      if(gray.at<uchar>(i,j)==255) 
       points.push_back(Point(j,i)); 
    box = minAreaRect(Mat(points)); 
    Point p2=Point(box.center.x,box.center.y); 

    //circle(img,p2,2,Scalar(0,255,0),-1); 
    circle(img,Point((p1.x+p2.x)/2,(p1.y+p2.y)/2),3,Scalar(0,0,255),-1); 
    imshow("img",img); 
    waitKey(); 

    return 0; 
} 
+0

偉大的工作!非常感謝。呃...我無法很好地理解你的方法。你能簡單解釋一下嗎?再次感謝。 –

0

而不是馬上工作在一個大的離譜的規模,被別人的建議,我建議瘦身第一(其中有去模糊的效果),請哈里斯的一個傳球找到拐角處,然後放大其位置並以全分辨率和大窗口(足夠大以涵蓋強度的明顯鞍點)執行findCornerSubpix傳遞。

通過這種方式,您可以獲得兩全其美的效果:快速檢測以初始化細化,並在給定原始圖像的情況下進行精確細化。

又見this other relevant answer

+0

感謝哥們!我一直在嘗試。實際上,可以通過縮放圖像找到拐角的粗略位置。但是,findCornerSubpix找到精確位置的結果並不好。我想我可能不得不實現一個新的subpix查找功能。 –

+0

令人驚訝! findCornerSubpix的行爲究竟如何(在完全分辨率下,初始化粗略位置後)?它會聚合到一些隨機的地方,還是靠近可能的鞍點,但不夠近?你有沒有嘗試增加迭代次數? –

+0

爲了澄清,您的圖片確實有一個明顯的鞍點,findCornerSubpix應該很容易地融合到它。看看強度以3d繪製時的樣子:http://i.imgur.com/xuVOmU6.jpg –