红外热像仪与激光雷达联合标定后将获得投影矩阵,在数据融合前后点云投影前后有对应关系,通过此关系就可以实现通过RGB值寻找到火点后找到对应的雷达点坐标,有很多不足之处,权当回忆吧!!!
通过RGB识别火点
clc
e=0.5;%控制精度0.5,1
k=0.5;
%/
% 输入所要查找的的RGB值
%138未发现火点,137输出
% r_value =30; %603,149等%138未发现火点
% g_value =33;
% b_value =42;
%
% r_value =5; %红色26,0,0
% g_value =5; %白5,5,5
% b_value =5;
%打开图片//
img = imread( 'G:\BiYeSheJi\matlab\0000000138.png' );%打开图片
figure('Position',[20 200 size(img,2) size(img,1)]);%设置窗格显示
axes('Position',[0 0 1 1]);%创建坐标图,定义图形位置和大小,[left bottom width height]
imshow(img,[]);
s=size(img);
%disp(img)
hold on;%当前图层设为背景
%//
put=questdlg('输入像素坐标还是RGB','火点定位方式','像素','RGB','close','像素');%新建窗口对话框提示
switch put
case '像素'
int=inputdlg({'X=','Y='},'请输入',[1 30;1 30]);
str=[str2double(int{1}) str2double(int{2})];
m=str(1,2);
n=str(1,1);
K=[m,n];
case 'RGB'
int=inputdlg({'R=','G=','B='},'请输入',[1 30;1 30;1 30]);%输入窗口
str=[str2double(int{1}) str2double(int{2}) str2double(int{3})];
r_value =str(1,1); % 将数值数组转换为表示数字的字符数组
g_value =str(1,2);
b_value =str(1,3);
r = img(:, :, 1);
g = img(:, :, 2);
b = img(:, :, 3);
index_r = (r == r_value);
index_g = (g == g_value);
index_b = (b == b_value);
index = index_r & index_g & index_b;
[m,n] = find(index==1);
K=[m,n];%疑似火点的所有像素点
case 'close'
clc
close all
end
% %RGB输入窗口//
% int=inputdlg({'R=','G=','B='},'请输入',[1 30;1 30;1 30]);%输入窗口
% str=[str2double(int{1}) str2double(int{2}) str2double(int{3})];
% r_value =str(1,1); % 将数值数组转换为表示数字的字符数组
% g_value =str(1,2);
% b_value =str(1,3);
% %
% % image 的r, g, b三个分量图像
% r = img(:, :, 1);
% g = img(:, :, 2);
% b = img(:, :, 3);
% % 标示出图像image中红色点的位置为1,其它点为0,结果存放在index中
% index_r = (r == r_value);
% index_g = (g == g_value);
% index_b = (b == b_value);
% index = index_r & index_g & index_b;
% % 最终的指定RGB点位置(x, y)坐标((r == r_value)&(g == g_value)&(b == b_value))
% [m,n] = find(index==1);
% K=[m,n];%疑似火点的所有像素点
A=K;
size(K,1);
%/
%%打开原始txt数据
T=importdata('G:\BiYeSheJi\matlab\velo.txt');
%打开投影后的txt数据
F=importdata('G:\BiYeSheJi\matlab\velo_img.txt');
%
u=0;
if(size(K,1)~=0)%K不为空矩阵时说明存在火点
for j=1:size(K,1)
x=K(j,2);
y=K(j,1);
g=0;
for i=1:size(T,1)
if(((x-e)<=F(i,1))&&(F(i,1)<(x+e)))%(x-e)<=F(i,1)&&F(i,1)<(x+e)
if(((y-e)<=F(i,2))&&(F(i,2)<(y+e)))
u=u+1;
g=1;
fprintf('%f %f %f %d\n',T(i,1),T(i,2),T(i,3),i);%原始点云数据
plot(x,y,'o','LineWidth',4,'MarkerSize',1 );%画点
%说明性文字num2str,XYZ坐标
str=[num2str(T(i,1)') num2str(T(i,2)') num2str(T(i,3)')];
text(x,y,cellstr(str),'color','white')%显示字符串
end
end
end
if(g==1)
A(j,:)=[];%清空该行
end
end
%///
%disp(A)
if(u~=size(K,1))
fprintf('存在未扫描到的火点\n') %存在火点,但是激光雷达未扫描到
%msgbox('未扫描到火点位置','提示信息')
button=questdlg('存在未扫描到的火点,点击No结束,点击continue扩大扫描范围','警告','Yes','No','continue','Yes');%新建窗口对话框提示
switch button
case 'yes'
case 'No'
close all
case 'continue'
%///
%///
h=e+k;
v=0;
for j=1:size(A,1)
x=A(j,2);
y=A(j,1);
for i=1:size(T,1)
if ((x-h)<=F(i,1)&&F(i,1)<(x+h))
if((y-h)<=F(i,2)&&F(i,2)<(y+h))
v=v+1;
fprintf('%f %f %f %d\n',T(i,1),T(i,2),T(i,3),i);%原始点云数据
plot(x,y,'o','LineWidth',4,'MarkerSize',1 );%画点
str=[ num2str(T(i,1)') num2str(T(i,2)') num2str(T(i,3)')];%将数字转为字符串
text(x,y,cellstr(str),'color','white')%显示字符串
end
end
end
end
if(v==0)
questdlg('仍然未扫描到火点','警告','结束','结束')
close all
else
questdlg('扫描结束','提示','Yes','Yes')
end
end
else
questdlg('扫描结束','提示','Yes','Yes');%新建窗口对话框提示
end
else
fprintf('未发现火点\n')
%msgbox('未发现火点','提示信息')
questdlg('未发现火点','提示','确定','确定')%新建窗口对话框提示
close all
end