cp_Main记录

具体代码如下所示: 

%% section I: Read source images
clear all
set(0,'defaultfigurecolor','w') 
DistortFlag = 0; %input('Is there distortion of infrared image? :\n');
[I1gray, I2gray, I1rgb, I2rgb, f1, f2, path] = cp_readImage;
%% section II: Resize images based on the minimum imaclosege height
height = size(I1gray,1);
[I1, I2, scale] = cp_resizeImage(I1gray,I2gray,height);
%% section III: Registrate iteratively & Coarse matching
close all;
clc;
I1_itea = I1;
iterationNum = 1;
iteration = 0;
Runtime = 0;
maxRMSE = 4*ceil(size(I2,1)/300);
AffineTrans = zeros([3 3 iterationNum]);
while  iteration < iterationNum
    fprintf('\n%d(th) iteration of registration...\n',iteration);
    [P1,P2, Rt,corner12] = cp_registration(I1_itea,I2, 20, maxRMSE,iteration, 1,  0,      6, 1    ,I2gray);
                        % cp_registration(I1,    I2, theta,maxRMSE,iteration,zoom+,zoom-,Lc,showflag,I2gray)
    Runtime = Rt + Runtime
    [I1_itea,affmat] = cp_getAffine(I1_itea,I2,P1,P2); % [v1,u1]==[v2,u2]
    iteration = iteration+1;
    AffineTrans(:,:,iteration) = affmat.T;
end
% Points of I1gray after resize 
P1  = [P1 ones([length(P1) 1])];
[pos_cor1,~] = find(corner12(:,1) == 0);
for iteration = iteration:-1:2
    P1 = P1 / AffineTrans(:,:,iteration-1);
    cor12 = [corner12(1:pos_cor1-1,1:2) ones(pos_cor1-1,1)] / AffineTrans(:,:,iteration-1);
    P1(:,1:2) = P1(:,1:2) ./ P1(:,3);
    P1(:,3) = ones(length(P1),1);
    corner12(1:pos_cor1-1,1:2) = cor12(:,1:2) ./ cor12(:,3);
    corner12(1:pos_cor1-1,3) = ones(pos_cor1-1,1);
end
P1 = P1(:,1:2);
corner12 = corner12(:,1:2);
% Correct matches in the source images
P1(:,2) = size(I1gray,1) / 2 + scale(1) * ( P1(:,2)-size(I1,1)/2);
P1(:,1) = size(I1gray,2) / 2 + scale(1) * ( P1(:,1)-size(I1,2)/2);
corner12(1:pos_cor1-1,2) = size(I1gray,1) / 2 + scale(1) * ( corner12(1:pos_cor1-1,2)-size(I1,1)/2);
corner12(1:pos_cor1-1,1) = size(I1gray,2) / 2 + scale(1) * ( corner12(1:pos_cor1-1,1)-size(I1,2)/2);

P2(:,2) = size(I2gray,1) / 2 + scale(2) * ( P2(:,2)-size(I2,1)/2);
P2(:,1) = size(I2gray,2) / 2 + scale(2) * ( P2(:,1)-size(I2,2)/2);
corner12(pos_cor1+1:end,2) = size(I2gray,1) / 2 + scale(2) * ( corner12(pos_cor1+1:end,2)-size(I2,1)/2);
corner12(pos_cor1+1:end,1) = size(I2gray,2) / 2 + scale(2) * ( corner12(pos_cor1+1:end,1)-size(I2,2)/2);
%% section IV: Fine matching
P3 = cp_subpixelFine(P1,P2); % Fine matching
%% section V: Show visual registration result
[~,affmat] = cp_getAffine(I1gray,I2gray,P1,P3);
Imosaic = cp_graymosaic(I1gray, I2gray, affmat);
figure, subplot(121),imshow(Imosaic);subplot(122),imshow(cp_rgbmosaic(I1rgb,I2rgb,affmat));
cp_showResult(I1rgb,I2rgb,I1gray,I2gray,affmat,3); % checkborder image
cp_showMatch(I1rgb,I2rgb,P1,P2,[],'Before Subpixel Fining');
cp_showMatch(I1rgb,I2rgb,P1,P3,[],'After Subpixel Fineing');
% imwrite(cp_rgbmosaic(I1rgb,I2rgb,affmat),['D:\' f1(1:end-4) '_Mosaic.jpg']);

%% Obtain reference transformation matrix manually
% [I1_aff,refaffmatT] = cp_manuallyTrans(I1rgb,I2rgb);
% cp_showResult(I1rgb,I2rgb,I1gray,I2gray,refaffmatT,5);
% refTrans = refaffmatT.T;
% save([path f1(1:end-4) '.mat'],'refTrans')

第一部分:读取图片

%% section I: Read source images
clear all
set(0,'defaultfigurecolor','w') 
DistortFlag = 0; %input('Is there distortion of infrared image? :\n');
[I1gray, I2gray, I1rgb, I2rgb, f1, f2, path] = cp_readImage;

第二部分:resize图片

%% section II: Resize images based on the minimum imaclosege height
height = size(I1gray,1);
[I1, I2, scale] = cp_resizeImage(I1gray,I2gray,height);

第三部分:回归并且粗匹配

%% section III: Registrate iteratively & Coarse matching
close all;
clc;
I1_itea = I1;
iterationNum = 1;
iteration = 0;
Runtime = 0;
maxRMSE = 4*ceil(size(I2,1)/300);
AffineTrans = zeros([3 3 iterationNum]);
while  iteration < iterationNum
    fprintf('\n%d(th) iteration of registration...\n',iteration);
    [P1,P2, Rt,corner12] = cp_registration(I1_itea,I2, 20, maxRMSE,iteration, 1,  0,      6, 1    ,I2gray);
                        % cp_registration(I1,    I2, theta,maxRMSE,iteration,zoom+,zoom-,Lc,showflag,I2gray)
    Runtime = Rt + Runtime
    [I1_itea,affmat] = cp_getAffine(I1_itea,I2,P1,P2); % [v1,u1]==[v2,u2]
    iteration = iteration+1;
    AffineTrans(:,:,iteration) = affmat.T;
end
% Points of I1gray after resize 
P1  = [P1 ones([length(P1) 1])];
[pos_cor1,~] = find(corner12(:,1) == 0);
for iteration = iteration:-1:2
    P1 = P1 / AffineTrans(:,:,iteration-1);
    cor12 = [corner12(1:pos_cor1-1,1:2) ones(pos_cor1-1,1)] / AffineTrans(:,:,iteration-1);
    P1(:,1:2) = P1(:,1:2) ./ P1(:,3);
    P1(:,3) = ones(length(P1),1);
    corner12(1:pos_cor1-1,1:2) = cor12(:,1:2) ./ cor12(:,3);
    corner12(1:pos_cor1-1,3) = ones(pos_cor1-1,1);
end
P1 = P1(:,1:2);
corner12 = corner12(:,1:2);
% Correct matches in the source images
P1(:,2) = size(I1gray,1) / 2 + scale(1) * ( P1(:,2)-size(I1,1)/2);
P1(:,1) = size(I1gray,2) / 2 + scale(1) * ( P1(:,1)-size(I1,2)/2);
corner12(1:pos_cor1-1,2) = size(I1gray,1) / 2 + scale(1) * ( corner12(1:pos_cor1-1,2)-size(I1,1)/2);
corner12(1:pos_cor1-1,1) = size(I1gray,2) / 2 + scale(1) * ( corner12(1:pos_cor1-1,1)-size(I1,2)/2);

P2(:,2) = size(I2gray,1) / 2 + scale(2) * ( P2(:,2)-size(I2,1)/2);
P2(:,1) = size(I2gray,2) / 2 + scale(2) * ( P2(:,1)-size(I2,2)/2);
corner12(pos_cor1+1:end,2) = size(I2gray,1) / 2 + scale(2) * ( corner12(pos_cor1+1:end,2)-size(I2,1)/2);
corner12(pos_cor1+1:end,1) = size(I2gray,2) / 2 + scale(2) * ( corner12(pos_cor1+1:end,1)-size(I2,2)/2);

下面进行分解:

a部分:

%% section III: Registrate iteratively & Coarse matching
close all;
clc;
I1_itea = I1;
iterationNum = 1;
iteration = 0;
Runtime = 0;
maxRMSE = 4*ceil(size(I2,1)/300);
AffineTrans = zeros([3 3 iterationNum]);
while  iteration < iterationNum
    fprintf('\n%d(th) iteration of registration...\n',iteration);
    [P1,P2, Rt,corner12] = cp_registration(I1_itea,I2, 20, maxRMSE,iteration, 1,  0,      6, 1    ,I2gray);
                        % cp_registration(I1,    I2, theta,maxRMSE,iteration,zoom+,zoom-,Lc,showflag,I2gray)
    Runtime = Rt + Runtime
    [I1_itea,affmat] = cp_getAffine(I1_itea,I2,P1,P2); % [v1,u1]==[v2,u2]
    iteration = iteration+1;
    AffineTrans(:,:,iteration) = affmat.T;
end

         a部分的重要函数就是cp_regisration,其中他返回的参数为(P1,P2,Rt,corner12)也就是(regis_points1, regis_points2, Runtime, cor12),其中regis_points1表示对红外图片进行SIFT,RANSAC算法处理之后保存的匹配正确的(y,x)坐标,不包括角度(此时的坐标是图像处理的坐标系,将其转化为笛卡尔坐标系下的,坐标原点在左下角方便后续画图)。regis_points2同理。Runtime是cp_regisration运行的时间,cor12 = [cor1(:,2) cor1(:,1); 0 0; cor2(:,2) cor2(:,1)],cor1表示红外的极大值点,cor1(:,2)为y轴坐标。

 cp_getAffine函数如下:(计算投影映射变换矩阵),返回参数

B = imwarp(A,tform) 根据几何变换 tform 来变换数值、逻辑或分类图像 A。该函数在 B 中返回变换后的图像。

function [Iaffine,affmat] = cp_getAffine(I1,I2,p1,p2)
if size(p1,1) == 3 
    affmat = fitgeotrans(p1,p2,'affine');
    disp('     Affine transformation applied!');
    Iaffine = imwarp(I1,affmat,'OutputView',imref2d(size(I2)));
elseif size(p1,1) >= 4
    affmat = fitgeotrans(p1,p2,'projective');
    disp('     Projective transformation applied!');
    Iaffine = imwarp(I1,affmat,'OutputView',imref2d(size(I2)));
elseif size(p1,1) == 2 
    affmat = fitgeotrans(p1,p2,'nonreflectivesimilarity');
    disp('     Nonreflective similarity transformation applied!');
    Iaffine = imwarp(I1,affmat,'OutputView',imref2d(size(I2)));
else
    error('Transformation Failed! No sufficient Matches!!');
end

第四部分:细匹配

P3 = cp_subpixelFine(P1,P2); % Fine matching

 第五部分:融合,绘制,保存图片

%% section V: Show visual registration result
[~,affmat] = cp_getAffine(I1gray,I2gray,P1,P3);
Imosaic = cp_graymosaic(I1gray, I2gray, affmat);
figure, subplot(121),imshow(Imosaic);subplot(122),imshow(cp_rgbmosaic(I1rgb,I2rgb,affmat));
cp_showResult(I1rgb,I2rgb,I1gray,I2gray,affmat,3); % checkborder image
cp_showMatch(I1rgb,I2rgb,P1,P2,[],'Before Subpixel Fining');
cp_showMatch(I1rgb,I2rgb,P1,P3,[],'After Subpixel Fineing');
% imwrite(cp_rgbmosaic(I1rgb,I2rgb,affmat),['D:\' f1(1:end-4) '_Mosaic.jpg']);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CP30是一个开源的JDBC连接池,它可以更好地管理数据库连接。下面给出一个使用CP30实现数据库增删查改的示例代码。 首先,需要在pom.xml中添加CP30的依赖: ```xml <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.5</version> </dependency> ``` 然后,创建一个DBUtil类,用于创建和管理连接池: ```java import com.mchange.v2.c3p0.ComboPooledDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBUtil { private static DataSource dataSource; static { dataSource = new ComboPooledDataSource("mysql"); } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } public static void close(Connection conn, Statement stmt, ResultSet rs) { try { if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (stmt != null) { stmt.close(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } } ``` 接下来,可以创建一个User类,用于表示数据库中的一条记录: ```java public class User { private int id; private String name; private int age; public User(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } ``` 然后,可以创建一个UserDAO类,用于实现数据库的增删查改: ```java import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class UserDAO { public void addUser(User user) { Connection conn = null; PreparedStatement stmt = null; try { conn = DBUtil.getConnection(); stmt = conn.prepareStatement("INSERT INTO user(name, age) VALUES (?, ?)"); stmt.setString(1, user.getName()); stmt.setInt(2, user.getAge()); stmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(conn, stmt, null); } } public void deleteUser(int id) { Connection conn = null; PreparedStatement stmt = null; try { conn = DBUtil.getConnection(); stmt = conn.prepareStatement("DELETE FROM user WHERE id = ?"); stmt.setInt(1, id); stmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(conn, stmt, null); } } public void updateUser(User user) { Connection conn = null; PreparedStatement stmt = null; try { conn = DBUtil.getConnection(); stmt = conn.prepareStatement("UPDATE user SET name = ?, age = ? WHERE id = ?"); stmt.setString(1, user.getName()); stmt.setInt(2, user.getAge()); stmt.setInt(3, user.getId()); stmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(conn, stmt, null); } } public List<User> getUsers() { Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; List<User> users = new ArrayList<>(); try { conn = DBUtil.getConnection(); stmt = conn.prepareStatement("SELECT * FROM user"); rs = stmt.executeQuery(); while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); int age = rs.getInt("age"); User user = new User(id, name, age); users.add(user); } } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(conn, stmt, rs); } return users; } } ``` 最后,可以在Main类中测试以上的代码: ```java public class Main { public static void main(String[] args) { UserDAO dao = new UserDAO(); // 添加一条记录 dao.addUser(new User(1, "张三", 20)); // 更新一条记录 dao.updateUser(new User(1, "李四", 21)); // 删除一条记录 dao.deleteUser(1); // 查询所有记录 List<User> users = dao.getUsers(); for (User user : users) { System.out.println(user.getId() + " " + user.getName() + " " + user.getAge()); } } } ``` 以上代码实现了使用CP30连接池的数据库增删查改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值