寻找拼图的角落

时间:2015-02-24 08:58:12

标签: opencv image-processing bufferedimage javacv imagej


情景:

扫描拼图并让计算机解决它(Java应用程序)。

我正在寻找一种找到拼图块角落的方法。

enter image description here

我不知道我是否可以使用框架来解决这个问题。我可以在这里使用类似模板的东西找到角落吗?或者我必须自己实施算法?

我需要将一个单件放到一个直的位置。如果我有两个角落,我可以计算出将图像旋转到平直水平所需的角度。 在特定的框架中,我不需要这样的功能。

(可选)我的方法是: 我自己实现一个算法(可能非常不合格)。

  1. 创建一个二维数组,其中所有白色像素均为0,所有彩色/黑色像素均为1。
  2. 循环通过2D阵列并搜索带有1的像素。从这里搜索所有相邻的1。
  3. 如果相邻的1少于50,请忽略此"像素"并继续(扫描错误)
  4. 如果有超过50个相邻的1,则它是一个拼图(并且没有扫描错误)。完成整块并将它们全部复制到一个新的2D阵列中,不会出现扫描错误。
  5. 在新阵列中,搜索角度......

1 个答案:

答案 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);
}

并在确定的角落周围画了一些圈子以获得乐趣。

enter image description here