我想找到一個模糊圖像的角落裏面有一個角落。像下面的例子:如何使用opencv查找模糊角落位置?
我可以確保只有一個角是圖像裏面,我認爲
角落是黑色和白色棋盤的一部分。
如何使用openCV檢測交叉位置? 謝謝!
我想找到一個模糊圖像的角落裏面有一個角落。像下面的例子:如何使用opencv查找模糊角落位置?
我可以確保只有一個角是圖像裏面,我認爲
角落是黑色和白色棋盤的一部分。
如何使用openCV檢測交叉位置? 謝謝!
一般可以使用梯度確定的角:
的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
另一種解決方案
#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;
}
偉大的工作!非常感謝。呃...我無法很好地理解你的方法。你能簡單解釋一下嗎?再次感謝。 –
而不是馬上工作在一個大的離譜的規模,被別人的建議,我建議瘦身第一(其中有去模糊的效果),請哈里斯的一個傳球找到拐角處,然後放大其位置並以全分辨率和大窗口(足夠大以涵蓋強度的明顯鞍點)執行findCornerSubpix傳遞。
通過這種方式,您可以獲得兩全其美的效果:快速檢測以初始化細化,並在給定原始圖像的情況下進行精確細化。
感謝哥們!我一直在嘗試。實際上,可以通過縮放圖像找到拐角的粗略位置。但是,findCornerSubpix找到精確位置的結果並不好。我想我可能不得不實現一個新的subpix查找功能。 –
令人驚訝! findCornerSubpix的行爲究竟如何(在完全分辨率下,初始化粗略位置後)?它會聚合到一些隨機的地方,還是靠近可能的鞍點,但不夠近?你有沒有嘗試增加迭代次數? –
爲了澄清,您的圖片確實有一個明顯的鞍點,findCornerSubpix應該很容易地融合到它。看看強度以3d繪製時的樣子:http://i.imgur.com/xuVOmU6.jpg –
使用閾值函數來獲得唯一的二進制圖像,比CornerHarris找到角落 – Engine