opencv-warpAffine,matlab-imwarp

clearall;
%% title
info_=[
    '文档的功能: 是实现对图像的标准化' ...
    ',标准化的方式采用将所有形状对齐的平均形状. \n'...
    '文档的创建时间为:2016/11/1/18:37 \n'];
%% content
data = load('pose_train_data.mat','s_traindata','s_testdata');
train_data = data.s_traindata;
test_data = data.s_testdata;
n_train = length(train_data);
n_test = length(test_data);

ref_model_size = 200;
face_size = 100;
disp_xy = 50;

mean_shape0 = calc_meanshape2(train_data);
isShow = true;
%for i=1:n_train
for i=1:1
    img = imread(train_data(i).imgPath);
    img = rgb2gray(img);
    landmark = train_data(i).landmark;
    nlandmark = train_data(i).nlandmark;
    bbox = train_data(i).bbox;
    face_img = img(bbox(2):bbox(2)+bbox(4),bbox(1):bbox(1)+bbox(3));

    mean_shape = mean_shape0;

    meanxy = mean(landmark,1);%landmark的中心
    % 将平均形状扩展到框架内
    mean_shape = disp_xy + face_size .* mean_shape;

    mean_shapexy = mean(mean_shape,1);%meanshape的中心

    % show
    %img = 255 * ones(ref_model_size,ref_model_size,3);
    %drawshapes(img, disp_xy + face_size * mean_shape);

    %from meanshape to landmark,计算相似变换矩阵
    trans_mat = fitgeotrans(bsxfun(@minus,landmark,meanxy),bsxfun(@minus,mean_shape,mean_shapexy), 'NonreflectiveSimilarity');

    %% 公式:(u,v)=(x,y,1)T
    % T=[sc -ss 0
    %    ss  sc 0
    %    tx  ty 1];

    %% 将landmark转换到标准框架内
    m_landmark = bsxfun(@minus,landmark,meanxy);

    warp_landmark = transformPointsForward(trans_mat,m_landmark);

    for j = 1:nlandmark
        warp_landmark(j,1) = warp_landmark(j,1)+mean_shapexy(1);
        warp_landmark(j,2) = warp_landmark(j,2)+mean_shapexy(2);
    end
    %% 将图像转换到标准框架中
    %res_img=zeros(ref_model_size,ref_model_size);
    % 原理上 T(3,1)=T(3,2)=0
    T = trans_mat.T;
    T1 = T;
    T1(3,1) = T(3,1)+mean_shapexy(1)-(T(1,1)*meanxy(1)+T(2,1)*meanxy(2));
    T1(3,2) = T(3,2)+mean_shapexy(2)-(T(1,2)*meanxy(1)+T(2,2)*meanxy(2));
    trans_mat.T = T1;

    T2 = zeros(2,3);
    T2(1,1) = T(1,1);
    T2(1,2) = T(2,1);
    T2(2,1) = T(1,2);
    T2(2,2) = T(2,2);
    T2(1,3) = T(3,1)+mean_shapexy(1)-(T(1,1)*meanxy(1)+T(2,1)*meanxy(2));
    T2(2,3) = T(3,2)+mean_shapexy(2)-(T(1,2)*meanxy(1)+T(2,2)*meanxy(2));
    wsize = [ref_model_size ref_model_size];

    %matlab
    tic;
    %[size.h size.w]为目标图像的大小. [1 size.w] [1 size.h]为显示的x,y的范围。
    RA = imref2d([wsize(1) wsize(2)], [1 wsize(2)], [1 wsize(1)]);
    [out,r] = imwarp(face_img, trans_mat, 'OutputView', RA);
    m_time=toc;
    %opencv
    tic;
    res_img = cv.warpAffine(face_img,T2,'DSize',wsize,'WarpInverse',false);
    o_time=toc;
    if isShow
        disp(['matlab相似变换的时间: ' num2str(m_time)]);
        disp(['opencv相似变换的时间: ' num2str(o_time)]);
        figure(1);
        subplot(2,2,1);
        imshow(img);
        subplot(2,2,2);
        imshow(out,[]);
        hold on;
        for j = 1:nlandmark
            plot(warp_landmark(j,1),warp_landmark(j,2),'.r','markersize',15);
        end
        pause();
    end
end

时间:

matlab相似变换的时间: 0.0083993
opencv相似变换的时间: 0.00037726
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值