情景:
我正在寻找一种找到拼图块角落的方法。
我不知道我是否可以使用框架来解决这个问题。我可以在这里使用类似模板的东西找到角落吗?或者我必须自己实施算法?
我需要将一个单件放到一个直的位置。如果我有两个角落,我可以计算出将图像旋转到平直水平所需的角度。 在特定的框架中,我不需要这样的功能。
(可选)我的方法是: 我自己实现一个算法(可能非常不合格)。
答案 0 :(得分:0)
我不是OpenCV的专家,但我跟哈里斯角点探测器一样:
////////////////////////////////////////////////////////////////////////////////
// Compile and run under OSX with:
// clang++ -O3 $(pkg-config --cflags --libs opencv) harris.cpp -o harris && ./harris
////////////////////////////////////////////////////////////////////////////////
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
using namespace std;
int thresh = 200;
int main( )
{
Mat src,gray;
// Load image and convert to greyscale
src=imread("jigsaw.jpg",1);
cvtColor(src,gray,CV_BGR2GRAY);
Mat dst,dst_norm,dst_norm_scaled;
dst=Mat::zeros(src.size(),CV_32FC1);
// Detect corners
cornerHarris(gray,dst,7,5,0.05,BORDER_DEFAULT);
// Normalize
normalize(dst,dst_norm,0,255,NORM_MINMAX,CV_32FC1,Mat());
convertScaleAbs(dst_norm,dst_norm_scaled);
// Draw circles around corners
for(int j = 0;j<dst_norm.rows;j++){
for(int i = 0;i<dst_norm.cols;i++){
if((int)dst_norm.at<float>(j,i)>thresh){
circle(dst_norm_scaled,Point(i,j),10,Scalar(255,255,255),1,8,0);
}
}
}
// Display result
//imwrite("result.png",dst_norm_scaled);
namedWindow("corners_window",CV_WINDOW_AUTOSIZE);
imshow("corners_window",dst_norm_scaled);
waitKey(0);
return(0);
}
并在确定的角落周围画了一些圈子以获得乐趣。