角が内側にあるぼやけた画像の角の位置を見つけたいです。次の例のように:
画像内にコーナーが 1 つだけあることを確認できます。
角は黒と白のチェス盤の一部です。
openCVでクロス位置を検出するにはどうすればよいですか? ありがとう!
角が内側にあるぼやけた画像の角の位置を見つけたいです。次の例のように:
画像内にコーナーが 1 つだけあることを確認できます。
角は黒と白のチェス盤の一部です。
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+delta] - im[i][j-delta]; Gy = im[i+ デルタ][j] – im[i- デルタ][j];
デルタ = 50 で得た結果は次のとおりです。
勾配ノルム (20 倍)
勾配ノルム http://imageshack.us/scaled/thumb/822/xdpp.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;
}