分块仿射变换

来源:互联网 发布:java ajax post 跨域 编辑:程序博客网 时间:2024/04/28 13:48
#include "stdafx.h"  #include <opencv2/video/video.hpp>  #include <opencv2/highgui/highgui.hpp>  #include <opencv2/imgproc/imgproc.hpp>  #include <opencv2/core/core.hpp>  #include <fstream>    #include <iostream>  #include <cstdio>  #include "features2d/features2d.hpp"  using namespace std;  using namespace cv;    vector<Point2f> features; // 检测的特征    int maxCount = 500; // 检测的最大特征数  double qLevel = 0.01;   // 特征检测的等级  double minDist = 10.0;  // 两特征点之间的最小距离  vector<uchar> status; // 跟踪特征的状态,特征的流发现为1,否则为0  vector<float> err;  void on_mouse( int event, int x, int y, int flags, void* ustc);  bool acceptTrackedPoint(int i);  void main(){      Mat output,origin;      Mat image=imread("G:\\6.jpg",0);      Mat image2=imread("G:\\10.jpg",0);Mat result=imread("G:\\6.jpg",0);      Mat resutl=imread("G:\\10.jpg",0);    origin=imread("G:\\6.jpg",1);      output=imread("G:\\10.jpg",1);  int m=1;      //Mat imageROI1=image(Rect(0,90,160,45));//Mat imageROI2=image2(Rect(0,90,160,45));Mat imageROI1[4][8];Mat imageROI2[4][8];//Mat resultROI[4][8];Mat result1ROI[4][8];for(int k=0;k<4;k++)//行for(int t=0;t<8;t++){//列imageROI1[k][t]=image(Rect(80*t,45*k,80,45));imageROI2[k][t]=image2(Rect(80*t,45*k,80,45));result1ROI[k][t]=resutl(Rect(80*t,45*k,80,45));Mat warp_mat( 2, 3, CV_32FC1 );Mat warp_dst;vector<Point2f> points[2];    // point0为特征点的原来位置,point1为特征点的新位置/** * 提取像素点 */for(int j=0;j<imageROI1[k][t].rows;j+=15)//列for(int i=0;i<imageROI1[k][t].cols;i+=15)//行{points[0].push_back(Point2f(i,j));}//检测第二帧对应特征点          calcOpticalFlowPyrLK(imageROI1[k][t], imageROI2[k][t], points[0], points[1], status, err);//根据两帧之间特征点矢量长度去掉一些不好的特征点  int kk = 0;  for (size_t i=0; i<points[1].size(); i++)  {  if (acceptTrackedPoint(i)&&((abs(points[0][i].x - points[1][i].x) + abs(points[0][i].y - points[1][i].y)))<20)  {  points[0][kk]=points[0][i];  points[1][kk++] = points[1][i];  }  }  points[1].resize(kk);  points[0].resize(kk);//cout<<m++<<endl;//cout<<points[0]<<endl;//cout<<points[1]<<endl;if(points[0].size()>=3&&points[1].size()>+3){cout<<points[0].size()<<endl;cout<<points[1].size()<<endl;warp_mat=estimateRigidTransform(points[1],points[0],1);//求出仿射变换矩阵warpAffine( imageROI2[k][t], warp_dst, warp_mat, warp_dst.size() );//进行仿射变换//absdiff(imageROI1[k][t],warp_dst,result);//进行差分运算//absdiff(imageROI1[k][t],imageROI2[k][t],result1ROI[k][t]);//进行差分运算warp_dst.copyTo(imageROI2[k][t]);}}         /*for (size_t i=0; i<points[1].size(); i++)      {          line( imageROI2[k][t], points[0][i], points[1][i], Scalar(0, 255, 255));          circle( imageROI2[k][t], points[0][i], 2, Scalar(255, 0, 0), -1);          circle( imageROI2[k][t], points[1][i], 2, Scalar(0, 255, 0), -1);  cout<<(abs(points[0][i].x - points[1][i].x) + abs(points[0][i].y - points[1][i].y))<<endl;    } */ //////    for (size_t i=0; i<points[0].size(); i++)  //    {  //        circle(origin, points[0][i], 2, Scalar(255, 0, 0), -1);   //    } ///////*画网格线*/line(image2, Point(0,45), Point(640,45), Scalar(255, 255, 0));  line(image2, Point(0,90), Point(640,90), Scalar(255, 255, 0));line(image2, Point(0,135), Point(640,135), Scalar(255, 255, 0));for(int i=0;i<640;i+=80){line(image2, Point(i,0), Point(i,180), Scalar(255, 255, 0));}  /*  imshow("origin1",origin);      imshow("output1",output);      cvSetMouseCallback( "output", on_mouse, 0 );         cvSetMouseCallback( "origin", on_mouse, 0 );       */                 //imshow("original",imageROI1);//imshow("output",imageROI2); //   imshow("仿射变换",warp_dst);;           imshow("仿射帧间差",image);      imshow("直接帧间差1",image2);      waitKey(0);  //  }  bool acceptTrackedPoint(int i)  {     // return status[i] && ((abs(points[0][i].x - points[1][i].x) + abs(points[0][i].y - points[1][i].y)) <50)&& ((abs(points[0][i].x - points[1][i].x) + abs(points[0][i].y - points[1][i].y)) > 0);   return status[i] ;  }  void on_mouse( int event, int x, int y, int flags, void* ustc)      {          CvFont font;          cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA);                        if( event == CV_EVENT_LBUTTONDOWN )          {              CvPoint pt = cvPoint(x,y);              char temp[16];              sprintf(temp,"(%d,%d)",pt.x,pt.y);              cout<<temp<<endl;        }       }   

0 0
原创粉丝点击