#include <opencv2\opencv.hpp>
#include"highgui.h"
#include<cxcore.h>
#include<cv.h>
#include<iostream>
#include "CHausdorff.h"
#include<string>
#include<Windows.h>
using namespace cv;
using namespace std;
void delay(long t)
{
for(long i=0;i<t;i++)
{
for(long k=0;k<10000;k++)
{;
}
}
}
int main(int argc,char ** argv)
{
char modelName[] = "mega.bmp";
//********** 变量 ***********
double RowModelCen = 0.0; // 模板中心Y坐标
double ColumnModelCen = 0.0; // 模板中心X坐标
//************* 搜索图像的相关参数设定 ***************
double AngleStart = -50;
double AngleExtent = 50;
double AngleStep = 2;
//********** 获取模板图,获取中心坐标 ***********
IplImage *modelColor = cvLoadImage(modelName,1);
ColumnModelCen = int(modelColor->width/2)+1;
RowModelCen = int(modelColor->height/2)+1;
cvNamedWindow("model",1);
cvShowImage ( "model", modelColor );
double modelLength = modelColor->width;
//********** 模板图Canny边沿化 **********
IplImage* modelCanny=cvCreateImage(cvGetSize(modelColor),IPL_DEPTH_8U,1);
cvCanny( modelColor , modelCanny , 250 , 170 , 3);
cvNamedWindow("Canny",1);
cvShowImage ( "Canny", modelCanny );
//*************** 声明模板缓存空间 ****************
CvPoint **ModelXY;//储存边沿XY点相对中心坐标
double **ModelDisToCen;//储存轮廓点到中心的相对距离
int *ModelBlobCount;//储存每个步进角的轮廓点数
ModelXY = new CvPoint *[int((AngleExtent-AngleStart)/AngleStep)+1];
for(int i=0;i<int((AngleExtent-AngleStart)/AngleStep)+1;i++)
{ ModelXY[i] = new CvPoint[modelColor->width * modelColor->height]; }
ModelDisToCen = new double *[int((AngleExtent-AngleStart)/AngleStep)+1];
for(int i=0;i<int((AngleExtent-AngleStart)/AngleStep)+1;i++)
{ ModelDisToCen[i] = new double[modelColor->width * modelColor->height]; }
ModelBlobCount = new int[ int((AngleExtent-AngleStart)/AngleStep)+1];
for(int i=0;i<int((AngleExtent-AngleStart)/AngleStep)+1;i++)//边沿XY点个数
{ ModelBlobCount[i] = 0; }
int ModelNum = 0;
CvPoint **ModelCornXY;//储存每个角间距的四边形四角
ModelCornXY = new CvPoint *[int((AngleExtent-AngleStart)/AngleStep)+1];
for(int i=0;i<int((AngleExtent-AngleStart)/AngleStep)+1;i++)
{ ModelCornXY[i] = new CvPoint[4]; }
CvPoint *CannyXY;//储存canny后边沿XY的坐标
double *CannyDisToCen;//储存canny轮廓点到中心的相对距离
int CannyCount=0;//储存canny后的白点的数
CannyXY = new CvPoint[ modelColor->width * modelColor->height];//储存canny的所有白点坐标
CannyDisToCen = new double [modelColor->width * modelColor->height];
for(int i=0;i<modelColor->width * modelColor->height;i++)
{ CannyDisToCen[i] = 0; }
CannyCount=0;
std::vector<cv::Point2f> corners2;
//角点总数 -- 质量等级 -- 容忍距离
cv::goodFeaturesToTrack(cv::Mat(modelCanny),corners2,100,0.6,10);
std::vector<cv::Point2f>::const_iterator it2= corners2.begin();
while (it2!=corners2.end()) {
CannyXY[CannyCount].x = it2->x;
CannyXY[CannyCount].y = it2->y;
CannyDisToCen[CannyCount] = sqrt(pow((CannyXY[CannyCount].x-ColumnModelCen),2) + pow((CannyXY[CannyCount].y-RowModelCen),2));
CannyCount++;
//cv::circle(cv::Mat(modelColor),*it2,2,cv::Scalar(0,0,255),1);
++it2;
}
//cv::imshow("source1",cv::Mat(modelColor));
//************* 新建一幅临时显示图 ***************
IplImage* srcExam1=cvCreateImage(cvSize(modelLength,modelLength),IPL_DEPTH_8U,1);
cvZero(srcExam1);
cvNamedWindow("srcExam1",1);
cvShowImage ( "srcExam1", srcExam1 );
double start_t0 = GetTickCount();
//************* 各步进角的轮廓点的计算 ***************
for(int k=0;k<int((AngleExtent-AngleStart)/AngleStep);k++)
{
IplImage *modelColor = cvLoadImage(modelName,1);
double rotateAngle = AngleStart + k*AngleStep;
IplImage* srcExam1=cvCreateImage(cvSize(modelLength,modelLength),IPL_DEPTH_8U,1);
cvZero(srcExam1);
double start_t = GetTickCount();
//-------- 计算模板4顶点的坐标 -------
for(int n=0;n<4;n++)
{ double Q0=0;
if(n==0) ModelCornXY[k][n] = cvPoint(0,0);
else if(n==1) ModelCornXY[k][n] = cvPoint(modelCanny->width-1,0);
else if(n==2) ModelCornXY[k][n] = cvPoint(modelCanny->width-1,modelCanny->height-1);
else if(n==3) ModelCornXY[k][n] = cvPoint(0,modelCanny->height-1);
if(ModelCornXY[k][n].x > ColumnModelCen)
Q0 = atan(double(RowModelCen-ModelCornXY[k][n].y)/double(ColumnModelCen-ModelCornXY[k][n].x))*180/CV_PI;
else
Q0 = 180 + atan(double(RowModelCen-ModelCornXY[k][n].y)/double(ColumnModelCen-ModelCornXY[k][n].x))*180/CV_PI;
ModelCornXY[k][ n ].x = int(modelLength/2)*cos((rotateAngle+Q0)*CV_PI / 180);
ModelCornXY[k][ n ].y = int(modelLength/2)*sin((rotateAngle+Q0)*CV_PI / 180);
cvSet2D( srcExam1, ModelCornXY[k][ n ].y+int(modelLength/2), ModelCornXY[k][ n ].x+int(modelLength/2), Scalar( 255, 255, 255) );
}
//----------- 获取边沿点的个数和各点的坐标 ------------
CvScalar s;
ModelNum = 0;
for(int h=0;h<CannyCount;h++)
{
cvSet2D( modelColor, CannyXY[h].y, CannyXY[h].x, Scalar( 0, 255, 255) );
//-------- 保存各步进角各点到中心坐标距离 ---------
ModelDisToCen[k][ ModelNum ] = CannyDisToCen[h];
//-------- 用极坐标计算旋转后的点的坐标 ---------
double Q1,x1,y1;
if(CannyXY[h].x > ColumnModelCen)
Q1 = atan(double(RowModelCen-CannyXY[h].y)/double(ColumnModelCen-CannyXY[h].x))*180/CV_PI;
else
Q1 = 180+atan(double(RowModelCen-CannyXY[h].y)/double(ColumnModelCen-CannyXY[h].x))*180/CV_PI;
ModelXY[k][ ModelNum ].x = ModelDisToCen[k][ModelNum]*cos((rotateAngle+Q1)*CV_PI / 180);
ModelXY[k][ ModelNum ].y = ModelDisToCen[k][ModelNum]*sin((rotateAngle+Q1)*CV_PI / 180);
cvSet2D( srcExam1, ModelXY[k][ ModelNum ].y+int(modelLength/2), ModelXY[k][ ModelNum ].x+int(modelLength/2), Scalar( 255, 255, 255) );
ModelNum++;
ModelBlobCount[k]++;
}
double end_t = GetTickCount();
//-------- 多步进角运行显示 ---------
cout<<"第"<<k<<"次测试有 "<<ModelBlobCount[k] <<" 个轮廓点,当前步进角是 "<<rotateAngle <<" 耗时: "<<end_t - start_t <<endl;
cvShowImage ( "model", modelColor );
cvShowImage ( "srcExam1", srcExam1 );
delay(2000);
for ( ; ; ){ cvWaitKey(1)==100; break; }
//--------- 析放图像缓存 ---------
cvReleaseImage( &modelColor );
cvReleaseImage( &srcExam1 );
}
double end_t0 = GetTickCount();
cout<<" 耗时: "<<end_t0 - start_t0 <<endl;
cvWaitKey(0);
//**********************************************
//*************** 目标图像处理 ******************
//**********************************************
//********** 获取模板图,获取中心坐标 ***********
char srcName[] = "mega8.bmp";
//********** 变量 ***********
double RowSrcCen = 0.0; // 目标中心Y坐标
double ColumnSrcCen = 0.0; // 目标中心X坐标
double srcGreediness = 2; // 贪心算法
bool showFlag = false; //显示使能
//*********** 记录合适范围的个数和中心坐标 ************
int searchAgSteN =0;//当前步进角的个数
CvPoint searchCenPMax = cvPoint(modelColor->width/2,modelColor->width/2);//最大值的中心
int searchNumMax = 0;//最大值的个数
int searchAngleMax = 0;//最大值的步进角
double hausDis = MAX_DISTANCE;//hausdorff距离
double dHausMixDis = MAX_DISTANCE;//hausdorff最大距离
IplImage *srcColor = cvLoadImage(srcName,1);
cvNamedWindow("src",1);
cvShowImage ( "src", srcColor);
//********** 计算目标搜索图像的canny边沿数组 **********
IplImage* srcCanny=cvCreateImage(cvGetSize(srcColor),IPL_DEPTH_8U,1);
cvCanny( srcColor , srcCanny , 250 , 170 , 3);
//cvNamedWindow("srcCanny",1);
//cvShowImage ( "srcCanny", srcCanny );
// 用于Hausdorff的模板和目标图数组
CvPoint *pMPoints = new CvPoint[2 * modelColor->width * modelColor->height];//模板haus
CvPoint *pSPoints = new CvPoint[2 * srcColor->width * srcColor->height];//目标haus
int numMod=0;//模板haus点数
int numSrc=0;//目标haus点数
CHausdorff haus(modelCanny,srcCanny,8,8);
d
没有合适的资源?快使用搜索试试~ 我知道了~
Bobby-D-Match.rar_bobby _match Opencv
共299个文件
tlog:258个
bmp:14个
jpg:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 179 浏览量
2022-09-23
01:08:26
上传
评论
收藏 9.91MB RAR 举报
温馨提示
opencv自写的Horsdorff匹配搜索,融合了角点提取加快搜索速度
资源推荐
资源详情
资源评论
收起资源包目录
Bobby-D-Match.rar_bobby _match Opencv (299个子文件)
search3.bmp 819KB
mega6.bmp 765KB
mega7.bmp 765KB
mega5.bmp 765KB
mega8.bmp 765KB
mega4.bmp 759KB
mega2.bmp 415KB
megaS.bmp 208KB
mega3.bmp 208KB
mega8_resize.bmp 191KB
mega.bmp 72KB
mega_edge.bmp 72KB
mega0.bmp 34KB
mega_resize.bmp 18KB
test_open.cpp 25KB
CHausdorff.cpp 10KB
复件 test.dev 32KB
tbb_debug.dll 150KB
test_open.exe 75KB
test_open.vcxproj.filters 1KB
CHausdorff.h 2KB
vc100.idb 1.99MB
test_open.ilk 612KB
Search2.jpg 81KB
Search1.jpg 42KB
Template.jpg 8KB
test_open.lastbuildstate 159B
test_open.log 1KB
test_open.exe.embed.manifest 406B
test_open.exe.intermediate.manifest 381B
test_open.obj 232KB
CHausdorff.obj 133KB
test_open.pdb 1.92MB
vc100.pdb 1.21MB
test_open_manifest.rc 208B
test_open.exe.embed.manifest.res 472B
test_open.sdf 35.89MB
test_open.sln 894B
test_open.suo 25KB
CL.read.1.tlog 103KB
link.read.1.tlog 14KB
link.command.1.tlog 8KB
cl.command.1.tlog 5KB
link.write.1.tlog 4KB
CL.write.1.tlog 3KB
rc.command.1.tlog 2KB
mt.read.1.tlog 2KB
rc.write.1.tlog 1KB
mt.command.1.tlog 1KB
rc.read.1.tlog 1KB
mt.write.1.tlog 522B
link.3632-cvtres.write.1.tlog 2B
link.3676.read.1.tlog 2B
link.3740-cvtres.write.1.tlog 2B
link.840-cvtres.read.1.tlog 2B
link.3068-cvtres.write.1.tlog 2B
link.1132.write.1.tlog 2B
link.3348.write.1.tlog 2B
link.3372-cvtres.read.1.tlog 2B
link.3344.write.1.tlog 2B
link.2848.write.1.tlog 2B
link.3676-cvtres.read.1.tlog 2B
link.2788.write.1.tlog 2B
link.3632.read.1.tlog 2B
link.3892.write.1.tlog 2B
link.188.read.1.tlog 2B
link.3872-cvtres.read.1.tlog 2B
link.2088-cvtres.read.1.tlog 2B
link.3860.write.1.tlog 2B
link.1132.read.1.tlog 2B
link.2352.read.1.tlog 2B
link.2896-cvtres.read.1.tlog 2B
link.3740.write.1.tlog 2B
link.968.write.1.tlog 2B
link.1196-cvtres.read.1.tlog 2B
link.3632.write.1.tlog 2B
link.3448-cvtres.read.1.tlog 2B
link.3548-cvtres.read.1.tlog 2B
link.1240-cvtres.read.1.tlog 2B
link.2820.write.1.tlog 2B
link.528.write.1.tlog 2B
link.2820-cvtres.read.1.tlog 2B
link.528.read.1.tlog 2B
link.3048-cvtres.write.1.tlog 2B
link.2992.read.1.tlog 2B
link.1348-cvtres.read.1.tlog 2B
link.512-cvtres.write.1.tlog 2B
link.1680-cvtres.read.1.tlog 2B
link.3068-cvtres.read.1.tlog 2B
link.1268.write.1.tlog 2B
link.512-cvtres.read.1.tlog 2B
link.2820-cvtres.write.1.tlog 2B
link.3460.read.1.tlog 2B
link.3656-cvtres.read.1.tlog 2B
link.3976-cvtres.read.1.tlog 2B
link.1268-cvtres.read.1.tlog 2B
link.2476-cvtres.write.1.tlog 2B
link.840.read.1.tlog 2B
link.3372.read.1.tlog 2B
link.3356-cvtres.read.1.tlog 2B
共 299 条
- 1
- 2
- 3
资源评论
JaniceLu
- 粉丝: 78
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功