根据Opencv中检测到的功能对齐图像

阿纳尔·贝拉莫夫(Anar Bayramov)

嗨,我有一个基本图像以及其他要旋转的角度与基本图像相同的图像。

这是我的基本形象。

在此处输入图片说明

这是我要旋转的示例图像。

在此处输入图片说明

这是我的完整代码。

  #include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/nonfree/nonfree.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#define PI 3.14159265

using namespace cv;
using namespace std;


void rotate(cv::Mat& src, double angle, cv::Mat& dst)
{
    int len = std::max(src.cols, src.rows);
     cv::Point2f pt(len/2., len/2.);
     cv::Mat r = cv::getRotationMatrix2D(pt, angle, 1.0);

     cv::warpAffine(src, dst, r, cv::Size(len, len));
}



float angleBetween(const Point &v1, const Point &v2)
{
    float len1 = sqrt(v1.x * v1.x + v1.y * v1.y);
    float len2 = sqrt(v2.x * v2.x + v2.y * v2.y);

    float dot = v1.x * v2.x + v1.y * v2.y;

    float a = dot / (len1 * len2);

    if (a >= 1.0)
        return 0.0;
    else if (a <= -1.0)
        return PI;
    else{
        int degree;
        degree = acos(a)*180/PI;
        return degree;
        };
}



int main()
{

    Mat char1 = imread( "/Users/Rodrane/Documents/XCODE/OpenCV/mkedenemeleri/anarev/rotated.jpg",CV_LOAD_IMAGE_GRAYSCALE );

    Mat image = imread("/Users/Rodrane/Documents/XCODE/OpenCV/mkedenemeleri/anarev/gain2000_crop.jpg", CV_LOAD_IMAGE_GRAYSCALE );




    if( !char1.data )
    {
        std::cout<< "Error reading object " << std::endl;
        return -1;
    }

    GaussianBlur( char1, char1, Size(3, 3), 2, 2 );
    GaussianBlur( image, image, Size(3, 3), 2, 2 );
    adaptiveThreshold(char1,char1,255,CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY,9,14);
    adaptiveThreshold(image,image,255,CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY,9,14);

    //Detect the keypoints using SURF Detector
    int minHessian = 200;

    SurfFeatureDetector detector( minHessian );
    std::vector<KeyPoint> kp_object;

    detector.detect( char1, kp_object );

    //Calculate descriptors (feature vectors)
    SurfDescriptorExtractor extractor;
    Mat des_object;

    extractor.compute( char1, kp_object, des_object );

    FlannBasedMatcher matcher;


    namedWindow("Good Matches");

    std::vector<Point2f> obj_corners(4);

    //Get the corners from the object
    obj_corners[0] = cvPoint(0,0);
    obj_corners[1] = cvPoint( char1.cols, 0 );
    obj_corners[2] = cvPoint( char1.cols, char1.rows );
    obj_corners[3] = cvPoint( 0, char1.rows );



    Mat frame;




    Mat des_image, img_matches;
    std::vector<KeyPoint> kp_image;
    std::vector<vector<DMatch > > matches;
    std::vector<DMatch > good_matches;
    std::vector<Point2f> obj;
    std::vector<Point2f> scene;
    std::vector<Point2f> scene_corners(4);
    Mat H;


    detector.detect( image, kp_image );
    extractor.compute( image, kp_image, des_image );

    matcher.knnMatch(des_object, des_image, matches, 2);

    for(int i = 0; i < min(des_image.rows-1,(int) matches.size()); i++) //THIS LOOP IS SENSITIVE TO SEGFAULTS
    {
        if((matches[i][0].distance < 0.6*(matches[i][1].distance)) && ((int) matches[i].size()<=2 && (int) matches[i].size()>0))
        {
            good_matches.push_back(matches[i][0]);
        }
    }



    //Draw only "good" matches


    drawMatches( char1, kp_object, image, kp_image, good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );

    if (good_matches.size() >= 4)
    {
        for( int i = 0; i < good_matches.size(); i++ )
        {
            //Get the keypoints from the good matches
            obj.push_back( kp_object[ good_matches[i].queryIdx ].pt );
            scene.push_back( kp_image[ good_matches[i].trainIdx ].pt );
            cout<<angleBetween(obj[i],scene[i])<<endl; //angles between images

        }

        H = findHomography( obj, scene, CV_RANSAC );


        perspectiveTransform( obj_corners, scene_corners, H);

       // cout<<angleBetween(obj[0], scene[0])<<endl;


        //Draw lines between the corners (the mapped object in the scene image )

    }

    //Show detected matches
    // resize(img_matches, img_matches, Size(img_matches.cols/2, img_matches.rows/2));

    imshow( "Good Matches", img_matches );
    waitKey();

    return 0;
}

我的代码实际上是做什么的;

  • 我确实检测到两个图像的特征
  • 计算我的基础图像和示例图像之间的度数

由于点之间的所有度数都不相同,如何根据要素旋转图像?

例如,假设检测到字符M的特征,并且在某些情况下角度为30度,将图像旋转30度将使我水平对齐但垂直错误。

问题在于,即使第一个特征都在同一行中,这也不意味着示例图像正确旋转(例如,可能需要旋转180度以上)

Zedv

我没有使用角度就重新制作了您的函数:

void rotate(cv::Mat& originalImage,cv::Mat& rotatedImage,cv::InputArray rotated,
cv::Mat& dst) {
    std::vector<cv::Point2f> original(4);
    original[0] = cv::Point( 0, 0);
    original[1] = cv::Point( originalImage.cols, 0 );
    original[2] = cv::Point( originalImage.cols, originalImage.rows );
    original[3] = cv::Point( 0, originalImage.rows );

    dst = cv::Mat::zeros(originalImage.rows, originalImage.cols, CV_8UC3);
    cv::Mat transform = cv::getPerspectiveTransform(rotated, original);
    cv::warpPerspective(rotatedImage, dst, transform, dst.size() );
}

请注意,输入“ rotated”在您的情况下是“ scene_corners”,而“ dst”是生成的图像。

在此处输入图片说明

希望有帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在opencv java中裁剪检测到的面部图像

来自分类Dev

增加图像中检测到的颜色范围

来自分类Dev

OpenCV检测和计算图像功能

来自分类Dev

OpenCV Python HoughCircles:在图像边界之外检测到的圆

来自分类Dev

检测图像中的对象opencv

来自分类Dev

从图像中检测圆并裁剪检测到的ROI python

来自分类Dev

代码无法在OpenCV和C ++中检测到嘴

来自分类Dev

opencv中的SimpleBlobDetector无法检测到任何东西

来自分类Dev

如何显示在 OpenCV 中检测到的圆圈总数?(Python)

来自分类Dev

在功能中检测到无法访问的代码

来自分类Dev

iOS 7 CIFeature:CIDetectorEyeBlink无法检测到图像中的闭眼

来自分类Dev

在Swift中检测到碰撞时更改图像

来自分类Dev

如何改善OpenCV中的功能检测

来自分类Dev

使用opencv检测图像中的文本

来自分类Dev

在图像opencv中检测对象区域

来自分类Dev

使用opencv检测护照图像中的文本

来自分类Dev

图像python opencv中的圆形轮廓检测

来自分类Dev

使用opencv从图像中检测框

来自分类Dev

在C ++中具有功能对象自动检测类型

来自分类Dev

未检测到验证图像

来自分类Dev

Python OpenCV行检测以检测图像中的“ X”符号

来自分类Dev

在下面的示例中,功能对象“ rev”是根据自身定义的。这怎么可能?

来自分类Dev

图像中的 Opencv 方形检测并拍摄此图像

来自分类Dev

OpenCV检测图像边框

来自分类Dev

为什么可以在dplyr辅助功能“对面”中检测到tidyselect辅助功能“ where”?

来自分类Dev

为什么可以在dplyr辅助功能“对面”中检测到tidyselect辅助功能“ where”?

来自分类Dev

智能对齐/页面上多个图像的布局

来自分类Dev

根据浮动图像的高度垂直对齐div中的文本

来自分类Dev

检测到SURF后OpenCV崩溃

Related 相关文章

  1. 1

    如何在opencv java中裁剪检测到的面部图像

  2. 2

    增加图像中检测到的颜色范围

  3. 3

    OpenCV检测和计算图像功能

  4. 4

    OpenCV Python HoughCircles:在图像边界之外检测到的圆

  5. 5

    检测图像中的对象opencv

  6. 6

    从图像中检测圆并裁剪检测到的ROI python

  7. 7

    代码无法在OpenCV和C ++中检测到嘴

  8. 8

    opencv中的SimpleBlobDetector无法检测到任何东西

  9. 9

    如何显示在 OpenCV 中检测到的圆圈总数?(Python)

  10. 10

    在功能中检测到无法访问的代码

  11. 11

    iOS 7 CIFeature:CIDetectorEyeBlink无法检测到图像中的闭眼

  12. 12

    在Swift中检测到碰撞时更改图像

  13. 13

    如何改善OpenCV中的功能检测

  14. 14

    使用opencv检测图像中的文本

  15. 15

    在图像opencv中检测对象区域

  16. 16

    使用opencv检测护照图像中的文本

  17. 17

    图像python opencv中的圆形轮廓检测

  18. 18

    使用opencv从图像中检测框

  19. 19

    在C ++中具有功能对象自动检测类型

  20. 20

    未检测到验证图像

  21. 21

    Python OpenCV行检测以检测图像中的“ X”符号

  22. 22

    在下面的示例中,功能对象“ rev”是根据自身定义的。这怎么可能?

  23. 23

    图像中的 Opencv 方形检测并拍摄此图像

  24. 24

    OpenCV检测图像边框

  25. 25

    为什么可以在dplyr辅助功能“对面”中检测到tidyselect辅助功能“ where”?

  26. 26

    为什么可以在dplyr辅助功能“对面”中检测到tidyselect辅助功能“ where”?

  27. 27

    智能对齐/页面上多个图像的布局

  28. 28

    根据浮动图像的高度垂直对齐div中的文本

  29. 29

    检测到SURF后OpenCV崩溃

热门标签

归档