易网时代-编程资源站
Welcome
微信登录
编程资源
图片资源库
蚂蚁家优选
PDF转换器
软件资源
软件开发
、
小程序制作
、
系统集成与运维
、
空间租用
、
硬件开发
、
视频监控
、
技术咨询与支持
——联系电话:0311-88999002/88999003
首页
/
操作系统
/
Linux
/
ASIFT+OpenCV图像特征匹配实战
OpenCV包含头文件:
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
核心代码如下:
if
(!m_pImage1||!m_pImage2)
{
AfxMessageBox(
"please,select 2 images!"
);
return
;
}
UpdateData(TRUE);
CvSize sz1 = cvSize(m_pImage1->width,m_pImage1->height);
CvSize sz2 = cvSize(m_pImage2->width,m_pImage2->height);
CvScalar s;
IplImage *gimg1 = cvCreateImage(sz1,IPL_DEPTH_8U,1);
cvCvtColor(m_pImage1,gimg1,CV_BGR2GRAY);
IplImage *gimg2 = cvCreateImage(sz2,IPL_DEPTH_8U,1);
cvCvtColor(m_pImage2,gimg2,CV_BGR2GRAY);
size_t
w1, h1;
w1 = gimg1->width;
h1 = gimg1->height;
float
* iarr1 =
new
float
[w1*h1];
for
(
int
i=0;i<h1;i++)
{
for
(
int
j=0;j<w1;j++)
{
s=cvGet2D(gimg1,i,j);
iarr1[i*w1+j] = s.val[0];
}
}
vector<
float
> ipixels1(iarr1, iarr1 + w1 * h1);
delete
[] iarr1;
size_t
w2, h2;
w2 = gimg2->width;
h2 = gimg2->height;
float
* iarr2 =
new
float
[w2*h2];
for
(
int
i=0;i<h2;i++)
{
for
(
int
j=0;j<w2;j++)
{
s=cvGet2D(gimg2,i,j);
iarr2[i*w2+j] = s.val[0];
}
}
vector<
float
> ipixels2(iarr2, iarr2 + w2 * h2);
delete
[] iarr2;
float
wS = IM_X;
float
hS = IM_Y;
float
zoom1=0, zoom2=0;
int
wS1=0, hS1=0, wS2=0, hS2=0;
vector<
float
> ipixels1_zoom, ipixels2_zoom;
if
(!m_bOrininal)
{
if
(m_lWidth==0 || m_lHeight == 0)
return
;
wS = m_lWidth;
hS = m_lHeight;
float
InitSigma_aa = 1.6;
float
fproj_p, fproj_bg;
char
fproj_i;
float
*fproj_x4, *fproj_y4;
int
fproj_o;
fproj_o = 3;
fproj_p = 0;
fproj_i = 0;
fproj_bg = 0;
fproj_x4 = 0;
fproj_y4 = 0;
float
areaS = wS * hS;
// Resize image 1
float
area1 = w1 * h1;
zoom1 = sqrt(area1/areaS);
wS1 = (
int
) (w1 / zoom1);
hS1 = (
int
) (h1 / zoom1);
int
fproj_sx = wS1;
int
fproj_sy = hS1;
float
fproj_x1 = 0;
float
fproj_y1 = 0;
float
fproj_x2 = wS1;
float
fproj_y2 = 0;
float
fproj_x3 = 0;
float
fproj_y3 = hS1;
/* Anti-aliasing filtering along vertical direction */
if
( zoom1 > 1 )
{
float
sigma_aa = InitSigma_aa * zoom1 / 2;
GaussianBlur1D(ipixels1,w1,h1,sigma_aa,1);
GaussianBlur1D(ipixels1,w1,h1,sigma_aa,0);
}
// simulate a tilt: subsample the image along the vertical axis by a factor of t.
ipixels1_zoom.resize(wS1*hS1);
fproj (ipixels1, ipixels1_zoom, w1, h1, &fproj_sx, &fproj_sy, &fproj_bg, &fproj_o, &fproj_p,
&fproj_i , fproj_x1 , fproj_y1 , fproj_x2 , fproj_y2 , fproj_x3 , fproj_y3, fproj_x4, fproj_y4);
// Resize image 2
float
area2 = w2 * h2;
zoom2 = sqrt(area2/areaS);
wS2 = (
int
) (w2 / zoom2);
hS2 = (
int
) (h2 / zoom2);
fproj_sx = wS2;
fproj_sy = hS2;
fproj_x2 = wS2;
fproj_y3 = hS2;
/* Anti-aliasing filtering along vertical direction */
if
( zoom1 > 1 )
{
float
sigma_aa = InitSigma_aa * zoom2 / 2;
GaussianBlur1D(ipixels2,w2,h2,sigma_aa,1);
GaussianBlur1D(ipixels2,w2,h2,sigma_aa,0);
}
// simulate a tilt: subsample the image along the vertical axis by a factor of t.
ipixels2_zoom.resize(wS2*hS2);
fproj (ipixels2, ipixels2_zoom, w2, h2, &fproj_sx, &fproj_sy, &fproj_bg, &fproj_o, &fproj_p,
&fproj_i , fproj_x1 , fproj_y1 , fproj_x2 , fproj_y2 , fproj_x3 , fproj_y3, fproj_x4, fproj_y4);
}
else
{
ipixels1_zoom.resize(w1*h1);
ipixels1_zoom = ipixels1;
wS1 = w1;
hS1 = h1;
zoom1 = 1;
ipixels2_zoom.resize(w2*h2);
ipixels2_zoom = ipixels2;
wS2 = w2;
hS2 = h2;
zoom2 = 1;
}
int
num_of_tilts1 = m_lTilts1;
int
num_of_tilts2 = m_lTilts2;
int
verb = 0;
// Define the SIFT parameters
siftPar siftparameters;
default_sift_parameters(siftparameters);
vector< vector< keypointslist > > keys1;
vector< vector< keypointslist > > keys2;
int
num_keys1=0, num_keys2=0;
SetWindowText(
"Computing keypoints on the two images..."
);
CString str1,str2;
time_t
tstart, tend1,tend2;
tstart = time(0);
DWORD
dstart = GetTickCount();
num_keys1 = compute_asift_keypoints(ipixels1_zoom, wS1, hS1, num_of_tilts1, verb, keys1, siftparameters);
tend1 = time(0);
m_lKeyNum1 = num_keys1;
UpdateData(FALSE);
str1.Format(
"Img1 Keypoints computation accomplished in %f s"
,difftime(tend1, tstart));
SetWindowText(str1);
num_keys2 = compute_asift_keypoints(ipixels2_zoom, wS2, hS2, num_of_tilts2, verb, keys2, siftparameters);
tend2 = time(0);
m_lKeyNum2 = num_keys2;
UpdateData(FALSE);
str2.Format(
"Img2 Keypoints computation accomplished in %f s ,Matching the keypoints..."
,difftime(tend2, tstart));
SetWindowText(str2);
//// Match ASIFT keypoints
int
num_matchings;
matchingslist matchings;
tstart = time(0);
num_matchings = compute_asift_matches(num_of_tilts1, num_of_tilts2, wS1, hS1, wS2,
hS2, verb, keys1, keys2, matchings, siftparameters);
tend1 = time(0);
DWORD
dSpan = GetTickCount() - dstart;
cout <<
"Keypoints matching accomplished in "
<< difftime(tend1, tstart) <<
" seconds."
<< endl;
str2.Format(
"Keypoints matching accomplished in %f s"
,difftime(tend1, tstart));
SetWindowText(str2);
m_lMatches = num_matchings;
UpdateData(FALSE);
str1.Format(
"Total time used:%d ms"
,dSpan);
AfxMessageBox(str1);
cvRelease((
void
**)&gimg1);
cvRelease((
void
**)&gimg2);
运行界面:
收藏该网址
版权所有©石家庄振强科技有限公司2024
冀ICP备08103738号-5
网站地图