将一个四通道的图像转换为一个三通道的图像和一个arpha单通道图像

本文介绍了一个使用OpenCV库的C++程序,演示如何将一个四通道的RGBA图像转换为一个三通道的BGR图像和一个Alpha单通道图像。通过构造一个指定尺寸和颜色通道的图像,然后定义目标的BGR和Alpha图像,最后利用mixChannels函数完成通道的转换,并展示了转换后的图像。
#include<iostream>
#include<opencv2/opencv.hpp>


using namespace std;
using namespace cv;

//将一个四通道的图像转换为一个三通道的图像和一个arpha单通道图像。
//b此程序是mixchannel函数的简单用法。
int main()
{
	//1.构造一个四通道的rgba图像。
	Mat rgba(400,400,CV_8UC4,Scalar(1,2,3,4));//四通道图像。
	imshow("rgba",rgba);
	//2.定义两个图像,bgr和alpha图像。
	Mat bgr(rgba.size(),CV_8UC3);
	Mat alpha(rgba.size(),CV_8UC1);
	//3.输出数组。
	Mat out[] = {bgr,alpha};
	//4.设置对应的索引。0-2。 1-1 2-0 3-3 
	int frome_to[] = { 0,2,1,1,2,2,3,3 };
	//5.进行通道转换。
	mixChannels(&rgba,1,out,2,frome_to,4);//输入图像数,输出图像数,索引以及索引数。
	//6.显示。
	imshow("bgr",bgr);
	imshow("alpha",alpha);





	waitKey(0);
	return 0;

}

在这里插入图片描述

% 纯跟踪(Pure Pursuit)法 % 作者:Ally % 日期:20210429 clc clear close all load path.mat %路径文件 %% 相关参数定义 RefPos = path; % 预期轨迹 targetSpeed = 10; % m/s Kv = 0.1; % 前视距离系数 Kp = 0.8; % 速度P控制器系数 Ld0 = 2; % Ld0是预瞄距离的下限值 dt = 0.1; % 时间间隔,单位:s L = 2.9; % 车辆轴距,单位:m % 计算参考航向角 diff_x = diff(RefPos(:,1)) ; % diff_x(end+1) = diff_x(end); diff_y = diff(RefPos(:,2)) ; diff_y(end+1) = diff_y(end); refHeading = atan2(diff_y , diff_x); % 航向角 %% 主程序 % 车辆初始状态定义 pos = RefPos(1,:)+1; % 车辆初始位置设置 在轨迹的第一个点上偏移1 v = 0; % 开始的速度 heading = 0.02; % 航向角 % 将初始状态纳入实际状态数组中 pos_actual = pos; %实际位置 heading_actual = heading; v_actual = v; idx = 1; %参考轨迹点的索引号 latError_PP = []; % 循环遍历轨迹点 while idx < size(RefPos,1)-1 %idx是否小于参考轨迹的个数点-1,如果大于等于则已经完成轨迹跟踪 % 寻找预瞄距离范围内最近路径点 [lookaheadPoint,idx] = findLookaheadPoint(pos, v, RefPos,Kv, Ld0); %lookaheadPoint 是C点 % 计算控制量 [delta,latError] = pure_pursuit_control(lookaheadPoint,idx,pos, heading, v, RefPos,refHeading, Kv, Ld0,L); % 如果误差过大,退出循迹 if abs(latError) > 3 disp('误差过大,退出程序!\n') break end % 计算加速度 a = Kp* (targetSpeed-v)/dt; % 更新状态量 [pos, heading, v] = updateState(a,pos, heading, v,delta,L, dt); % 保存每一步的实际量 pos_actual(end+1,:) = pos; heading_actual(end+1,:) = heading; v_actual(end+1,:) = v; latError_PP(end+1,:) = [idx,latError]; end % 画图 figure plot(RefPos(:,1), RefPos(:,2), 'b'); xlabel('纵向坐标 / m'); ylabel('横向坐标 / m'); hold on for i = 1:size(pos_actual,1) scatter(pos_actual(i,1), pos_actual(i,2),150, '.r'); pause(0.01) end legend('规划车辆轨迹', '实际行驶轨迹') % 保存 path_PP = pos_actual; save path_PP.mat path_PP save latError_PP.mat latError_PP %% 首先在参考轨迹上搜索离当前车辆位置最近的点 function [lookaheadPoint,idx_target] = findLookaheadPoint(pos, v, RefPos, Kv, Ld0) % 找到距离当前位置最近的一个参考轨迹点的序号 % pos 车辆当前实际位置 % v车辆速度 % RefPos 参考轨迹 % Kv % Ld0 预瞄距离下限值 sizeOfRefPos = size(RefPos,1); for i = 1:sizeOfRefPos dist(i,1) = norm(RefPos(i,:) - pos); %计算两个点(参考轨迹点车辆后轴A点)之间的距离作为向量元素之差的范数 end [~,idx] = min(dist); % 距离值的最小值的序列号idx % 从该点开始向轨迹前方搜索,找到与预瞄距离最相近的一个轨迹点 L_steps = 0; % 参考轨迹上几个相邻点的累计距离 Ld = Kv*v + Ld0; % Ld0是预瞄距离的下限值; while L_steps < Ld && idx < sizeOfRefPos L_steps = L_steps + norm(RefPos(idx + 1,:) - RefPos(idx,:)); %计算两个点之间的距离作为向量元素之差的范数 idx = idx+1; end idx_target = idx; lookaheadPoint = RefPos(idx,:); end %% 获得控制量:前轮向 function [delta,latError] = pure_pursuit_control(lookaheadPoint,idx,pos, heading, v,RefPos,refHeading, Kv, Ld0, L) sizeOfRefPos = size(RefPos,1); if idx < sizeOfRefPos %预瞄点索引值是否小于参考轨迹点 如果大于把参考轨迹点最后一个点赋值 Point_temp = lookaheadPoint; else Point_temp = RefPos(end,1:2); end alpha = atan2(Point_temp(1,2) - pos(2), Point_temp(1,1) - pos(1)) - heading;%point_temp是预瞄点C,pos是当前位置A Ld = Kv*v + Ld0; % 求位置、航向角的误差 x_error = pos(1) - RefPos(idx,1); y_error = pos(2) - RefPos(idx,2); heading_r = refHeading(idx); % 根据百度Apolo,计算横向误差 latError = y_error*cos(heading_r) - x_error*sin(heading_r); % 前轮角 delta = atan2(2*L*sin(alpha), Ld); end %% 更新状态量 function [pos_new, heading_new, v_new] = updateState(a,pos_old, heading_old, v_old,delta,wheelbase, dt) % a 纵向加速度 pos_new(1) = pos_old(1) + v_old*cos(heading_old)*dt; pos_new(2) = pos_old(2) + v_old*sin(heading_old)*dt; heading_new= heading_old + v_old*dt*tan(delta)/wheelbase; v_new = v_old + a*dt; end 根据提供的代码生成S function的代码并给出carsim中的相关设置以进行纯跟踪法的仿真
最新发布
09-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值