运动图像的运动轨迹检测与特征点跟踪MATLAB实现

简介: 用于实现运动图像中的运动轨迹检测和特征点跟踪。该程序结合了多种计算机视觉技术,包括特征点检测、光流计算、轨迹可视化和运动分析。

用于实现运动图像中的运动轨迹检测和特征点跟踪。该程序结合了多种计算机视觉技术,包括特征点检测、光流计算、轨迹可视化和运动分析。

%% 运动图像的运动轨迹检测与特征点跟踪
% 描述: 实现运动图像中的特征点检测、跟踪和运动轨迹可视化

%% 清理工作区
clear; close all; clc;

%% 1. 视频输入处理
% 选项1: 从视频文件读取
videoFile = 'traffic.mp4'; % 替换为您的视频文件
if exist(videoFile, 'file')
    videoSource = VideoReader(videoFile);
    isLiveVideo = false;
else
    % 选项2: 从摄像头实时捕获
    videoSource = webcam;
    isLiveVideo = true;
    videoSource.ReturnFrame = true;
    videoSource.Resolution = '640x480';
    disp('使用摄像头实时捕获...');
end

% 获取第一帧
if isLiveVideo
    prevFrame = snapshot(videoSource);
else
    prevFrame = readFrame(videoSource);
end
prevGray = rgb2gray(prevFrame);

% 创建显示窗口
fig = figure('Name', '运动轨迹检测与特征点跟踪', 'NumberTitle', 'off', ...
    'Position', [100, 100, 1200, 600]);

%% 2. 特征点检测与初始化
% 检测Shi-Tomasi角点
points = detectMinEigenFeatures(prevGray, 'MinQuality', 0.01, 'FilterSize', 7);
points = points.selectStrongest(100); % 选择最强的100个点

% 初始化轨迹存储
trajectories = cell(1, points.Count);
colors = rand(points.Count, 3); % 为每个点分配随机颜色

% 初始化点位置
prevPoints = points.Location;
trackedPoints = prevPoints;
status = true(size(prevPoints, 1), 1);

% 创建点跟踪器
pointTracker = vision.PointTracker('MaxBidirectionalError', 1, 'NumPyramidLevels', 3);
initialize(pointTracker, prevPoints, prevGray);

%% 3. 主处理循环
frameCount = 0;
while true
    frameCount = frameCount + 1;

    % 获取下一帧
    if isLiveVideo
        currFrame = snapshot(videoSource);
    else
        if hasFrame(videoSource)
            currFrame = readFrame(videoSource);
        else
            break; % 视频结束
        end
    end

    % 转换为灰度图像
    currGray = rgb2gray(currFrame);

    % 更新点跟踪器
    [currPoints, status] = step(pointTracker, currGray);

    % 过滤掉跟踪失败的点
    validIdx = status == 1;
    currPoints = currPoints(validIdx, :);
    prevPoints = prevPoints(validIdx, :);
    trackedPoints = [trackedPoints; currPoints];

    % 更新轨迹
    for i = 1:size(currPoints, 1)
        idx = find(validIdx, i, 'first'); % 找到对应的原始索引
        if isempty(idx)
            continue;
        end

        % 存储当前点位置
        trajectories{
   idx} = [trajectories{
   idx}; currPoints(i, :)];
    end

    % 绘制结果
    displayFrame = currFrame;

    % 绘制轨迹
    for i = 1:length(trajectories)
        if ~isempty(trajectories{
   i})
            traj = trajectories{
   i};
            if size(traj, 1) > 1
                % 绘制轨迹线
                displayFrame = insertShape(displayFrame, 'Line', ...
                    [traj(end-1:end, 1), traj(end-1:end, 2), traj(end-1:end, 1), traj(end-1:end, 2)], ...
                    'Color', colors(i, :), 'LineWidth', 2);
            end

            % 绘制当前点
            displayFrame = insertMarker(displayFrame, traj(end, :), ...
                'o', 'Color', colors(i, :), 'Size', 5);
        end
    end

    % 绘制运动矢量
    motionVectors = currPoints - prevPoints;
    for i = 1:size(currPoints, 1)
        displayFrame = insertArrow(displayFrame, prevPoints(i, :), ...
            motionVectors(i, :), 'Color', colors(i, :), 'LineWidth', 2);
    end

    % 显示帧信息
    infoStr = sprintf('帧: %d\n跟踪点: %d', frameCount, size(currPoints, 1));
    displayFrame = insertText(displayFrame, [10, 10], infoStr, ...
        'FontSize', 14, 'BoxColor', 'black', 'TextColor', 'white');

    % 显示图像
    subplot(1, 2, 1);
    imshow(displayFrame);
    title('运动轨迹检测');

    % 显示光流场
    subplot(1, 2, 2);
    opticalFlow = opticalFlowLK(prevGray, currGray);
    flowImg = visualizeOpticalFlow(opticalFlow);
    imshow(flowImg);
    title('光流场可视化');

    drawnow;

    % 更新前一帧数据
    prevGray = currGray;
    prevPoints = currPoints;

    % 定期添加新的特征点
    if mod(frameCount, 10) == 0 || size(currPoints, 1) < 20
        % 检测新的特征点
        newPoints = detectMinEigenFeatures(currGray, 'MinQuality', 0.01, 'FilterSize', 7);
        newPoints = newPoints.selectStrongest(50); % 选择最强的50个点

        % 添加到跟踪器
        if ~isempty(newPoints.Location)
            initPoints = newPoints.Location;
            initialize(pointTracker, initPoints, currGray);

            % 为新点分配颜色
            newColors = rand(size(initPoints, 1), 3);
            colors = [colors; newColors];

            % 初始化轨迹
            for i = 1:size(initPoints, 1)
                trajectories{
   end+1} = initPoints(i, :);
            end
        end
    end

    % 退出条件
    if ~isLiveVideo && ~hasFrame(videoSource)
        break;
    end
    if isLiveVideo && frameCount > 300 % 限制实时处理的帧数
        break;
    end
end

%% 4. 运动分析与可视化
analyzeMotionPatterns(trajectories, colors);

%% 5. 释放资源
release(pointTracker);
if isLiveVideo
    clear videoSource;
end

%% 辅助函数:光流可视化
function flowImg = visualizeOpticalFlow(opticalFlow)
    % 可视化光流场
    [H, W] = size(opticalFlow);
    flowImg = zeros(H, W, 3, 'uint8');

    % 计算光流幅度和角度
    magnitude = vecnorm(opticalFlow, 2, 3);
    angle = atan2(opticalFlow(:,:,2), opticalFlow(:,:,1));

    % 归一化幅度
    maxMag = max(magnitude(:));
    if maxMag > 0
        magnitude = magnitude / maxMag;
    end

    % 创建HSV图像
    hsv = zeros(H, W, 3);
    hsv(:,:,1) = (angle + pi) / (2*pi); % 色调表示方向
    hsv(:,:,2) = magnitude;              % 饱和度表示速度
    hsv(:,:,3) = ones(H, W);             % 亮度设为最大

    % 转换为RGB
    flowImg = ind2rgb(round(hsv(:,:,1)*63), jet(64)); % 简化转换
    flowImg = im2uint8(flowImg);

    % 叠加原始图像(可选)
    % flowImg = imfuse(originalImg, flowImg, 'blend');
end

%% 辅助函数:运动模式分析
function analyzeMotionPatterns(trajectories, colors)
    % 分析运动模式并可视化
    figure('Name', '运动模式分析', 'NumberTitle', 'off', 'Position', [100, 100, 1200, 800]);

    % 1. 轨迹长度分布
    trajLengths = cellfun(@(x) size(x, 1), trajectories);
    subplot(2, 3, 1);
    histogram(trajLengths, 20);
    title('轨迹长度分布');
    xlabel('轨迹长度(帧数)');
    ylabel('点数');

    % 2. 平均速度分布
    avgSpeeds = zeros(1, length(trajectories));
    for i = 1:length(trajectories)
        if ~isempty(trajectories{
   i})
            traj = trajectories{
   i};
            displacements = diff(traj);
            speeds = sqrt(sum(displacements.^2, 2));
            avgSpeeds(i) = mean(speeds);
        end
    end
    subplot(2, 3, 2);
    histogram(avgSpeeds, 20);
    title('平均速度分布');
    xlabel('平均速度(像素/帧)');
    ylabel('点数');

    % 3. 运动方向分布
    directions = zeros(1, length(trajectories));
    for i = 1:length(trajectories)
        if ~isempty(trajectories{
   i}) && size(trajectories{
   i}, 1) > 1
            traj = trajectories{
   i};
            displacement = traj(end, :) - traj(1, :);
            directions(i) = atan2(displacement(2), displacement(1));
        end
    end
    subplot(2, 3, 3);
    rose(directions, 36);
    title('运动方向分布');
    set(gca, 'ThetaZeroLocation', 'top');

    % 4. 轨迹聚类可视化
    subplot(2, 3, 4);
    hold on;
    axis equal;
    grid on;
    title('轨迹聚类可视化');
    xlabel('X坐标');
    ylabel('Y坐标');

    for i = 1:length(trajectories)
        if ~isempty(trajectories{
   i}) && size(trajectories{
   i}, 1) > 5
            traj = trajectories{
   i};
            plot(traj(:,1), traj(:,2), 'Color', colors(i,:), 'LineWidth', 1.5);
            plot(traj(1,1), traj(1,2), 'go', 'MarkerSize', 5); % 起点
            plot(traj(end,1), traj(end,2), 'ro', 'MarkerSize', 5); % 终点
        end
    end

    % 5. 运动热点图
    subplot(2, 3, 5);
    hold on;
    title('运动热点图');
    xlabel('X坐标');
    ylabel('Y坐标');

    % 创建网格
    [H, W, ~] = size(get(gcf, 'UserData')); % 使用之前存储的图像尺寸
    if isempty(H) || isempty(W)
        H = 480; W = 640; % 默认值
    end

    gridSize = 20;
    xEdges = linspace(1, W, gridSize+1);
    yEdges = linspace(1, H, gridSize+1);

    % 计算每个网格中的点密度
    density = zeros(gridSize, gridSize);
    for i = 1:length(trajectories)
        if ~isempty(trajectories{
   i})
            traj = trajectories{
   i};
            for j = 1:size(traj, 1)
                x = traj(j, 1);
                y = traj(j, 2);
                [~, xIdx] = histc(x, xEdges);
                [~, yIdx] = histc(y, yEdges);
                if xIdx > 0 && xIdx <= gridSize && yIdx > 0 && yIdx <= gridSize
                    density(yIdx, xIdx) = density(yIdx, xIdx) + 1;
                end
            end
        end
    end

    % 绘制热点图
    imagesc(xEdges, yEdges, density);
    colormap(hot);
    colorbar;
    axis xy;

    % 6. 运动方向场
    subplot(2, 3, 6);
    hold on;
    title('运动方向场');
    quiverMean = [];

    for i = 1:length(trajectories)
        if ~isempty(trajectories{
   i}) && size(trajectories{
   i}, 1) > 1
            traj = trajectories{
   i};
            displacement = traj(end, :) - traj(1, :);
            if norm(displacement) > 5 % 忽略微小运动
                quiverMean = [quiverMean; traj(1, :), displacement];
            end
        end
    end

    if ~isempty(quiverMean)
        quiver(quiverMean(:,1), quiverMean(:,2), quiverMean(:,3), quiverMean(:,4), 0.5, 'AutoScale', 'off');
    end
    axis equal;
    grid on;
end

%% 辅助函数:光流计算(Lucas-Kanade方法)
function opticalFlow = opticalFlowLK(prevImg, currImg)
    % 使用Lucas-Kanade方法计算光流
    [fx, fy] = gradient(double(prevImg));
    ft = double(currImg) - double(prevImg);

    % 设置参数
    windowSize = 15;
    halfWin = floor(windowSize/2);

    [rows, cols] = size(prevImg);
    opticalFlow = zeros(rows, cols, 2);

    for y = halfWin+1:rows-halfWin
        for x = halfWin+1:cols-halfWin
            % 提取窗口
            Ix = fx(y-halfWin:y+halfWin, x-halfWin:x+halfWin);
            Iy = fy(y-halfWin:y+halfWin, x-halfWin:x+halfWin);
            It = ft(y-halfWin:y+halfWin, x-halfWin:x+halfWin);

            % 构建设计矩阵
            A = [Ix(:), Iy(:)];
            b = -It(:);

            % 求解光流方程
            if rank(A) >= 2
                flow = A \ b;
                opticalFlow(y, x, 1) = flow(1);
                opticalFlow(y, x, 2) = flow(2);
            end
        end
    end
end

程序功能说明

1. 视频输入处理

  • 支持从视频文件或摄像头实时捕获

  • 自动处理不同分辨率的输入

  • 提供实时预览和结果展示

2. 特征点检测与跟踪

  • 使用Shi-Tomasi角点检测器

  • 实现基于Lucas-Kanade的光流跟踪

  • 自动管理特征点生命周期(添加/删除)

  • 为每个特征点分配唯一颜色标识

3. 运动轨迹可视化

  • 实时绘制运动轨迹

  • 显示运动矢量和方向

  • 光流场可视化

  • 轨迹起点和终点标记

4. 运动模式分析

  • 轨迹长度分布统计

  • 平均速度计算

  • 运动方向分析

  • 轨迹聚类可视化

  • 运动热点图

  • 运动方向场

关键技术实现

1. 特征点检测与跟踪

% 检测Shi-Tomasi角点
points = detectMinEigenFeatures(prevGray, 'MinQuality', 0.01, 'FilterSize', 7);
points = points.selectStrongest(100); % 选择最强的100个点

% 创建点跟踪器
pointTracker = vision.PointTracker('MaxBidirectionalError', 1, 'NumPyramidLevels', 3);
initialize(pointTracker, prevPoints, prevGray);

% 更新点跟踪器
[currPoints, status] = step(pointTracker, currGray);

2. 光流计算(Lucas-Kanade方法)

function opticalFlow = opticalFlowLK(prevImg, currImg)
    [fx, fy] = gradient(double(prevImg));
    ft = double(currImg) - double(prevImg);

    windowSize = 15;
    halfWin = floor(windowSize/2);

    for y = halfWin+1:rows-halfWin
        for x = halfWin+1:cols-halfWin
            Ix = fx(y-halfWin:y+halfWin, x-halfWin:x+halfWin);
            Iy = fy(y-halfWin:y+halfWin, x-halfWin:x+halfWin);
            It = ft(y-halfWin:y+halfWin, x-halfWin:x+halfWin);

            A = [Ix(:), Iy(:)];
            b = -It(:);

            if rank(A) >= 2
                flow = A \ b;
                opticalFlow(y, x, 1) = flow(1);
                opticalFlow(y, x, 2) = flow(2);
            end
        end
    end
end

3. 轨迹可视化

% 绘制轨迹线
displayFrame = insertShape(displayFrame, 'Line', ...
    [traj(end-1:end, 1), traj(end-1:end, 2), traj(end-1:end, 1), traj(end-1:end, 2)], ...
    'Color', colors(i, :), 'LineWidth', 2);

% 绘制当前点
displayFrame = insertMarker(displayFrame, traj(end, :), ...
    'o', 'Color', colors(i, :), 'Size', 5);

% 绘制运动矢量
displayFrame = insertArrow(displayFrame, prevPoints(i, :), ...
    motionVectors(i, :), 'Color', colors(i, :), 'LineWidth', 2);

运动分析技术

1. 轨迹统计分析

% 轨迹长度分布
trajLengths = cellfun(@(x) size(x, 1), trajectories);
histogram(trajLengths, 20);

% 平均速度分布
displacements = diff(traj);
speeds = sqrt(sum(displacements.^2, 2));
avgSpeeds(i) = mean(speeds);
histogram(avgSpeeds, 20);

2. 运动方向分析

% 运动方向分布
displacement = traj(end, :) - traj(1, :);
directions(i) = atan2(displacement(2), displacement(1));
rose(directions, 36);

% 运动方向场
quiver(quiverMean(:,1), quiverMean(:,2), quiverMean(:,3), quiverMean(:,4), 0.5);

3. 运动热点图

% 创建网格
gridSize = 20;
xEdges = linspace(1, W, gridSize+1);
yEdges = linspace(1, H, gridSize+1);

% 计算每个网格中的点密度
density = zeros(gridSize, gridSize);
for i = 1:length(trajectories)
    traj = trajectories{
   i};
    for j = 1:size(traj, 1)
        x = traj(j, 1); y = traj(j, 2);
        [~, xIdx] = histc(x, xEdges);
        [~, yIdx] = histc(y, yEdges);
        density(yIdx, xIdx) = density(yIdx, xIdx) + 1;
    end
end

% 绘制热点图
imagesc(xEdges, yEdges, density);
colormap(hot);

使用说明

1. 基本使用

% 运行主程序
motionTrackingDemo();

% 指定视频文件
videoFile = 'my_traffic_video.mp4';
% 程序会自动检测并使用该文件

2. 参数调整

% 调整特征点检测参数
points = detectMinEigenFeatures(prevGray, ...
    'MinQuality', 0.005, ...  % 降低质量阈值检测更多点
    'FilterSize', 5, ...      % 减小滤波器尺寸
    'ROI', [100, 100, 400, 300]); % 指定感兴趣区域

% 调整跟踪器参数
pointTracker = vision.PointTracker(...
    'MaxBidirectionalError', 0.5, ... % 减小误差容限
    'NumPyramidLevels', 4);           % 增加金字塔层数

% 调整轨迹显示参数
displayFrame = insertShape(displayFrame, 'Line', ..., 'LineWidth', 3); % 加粗轨迹线

3. 处理特定场景

% 处理高速运动场景
pointTracker.NumPyramidLevels = 5; % 增加金字塔层数
pointTracker.MaxBidirectionalError = 2; % 增大误差容限

% 处理低纹理场景
points = detectSURFFeatures(prevGray); % 使用SURF特征检测器
points = points.selectStrongest(200); % 增加特征点数量

% 处理遮挡场景
if mod(frameCount, 5) == 0 % 更频繁地添加新点
    newPoints = detectMinEigenFeatures(currGray, 'MinQuality', 0.01);
    % 添加到跟踪器...
end

扩展功能

1. 3D运动重建

function reconstruct3DMotion(trajectories, cameraParams)
    % 使用多视图几何重建3D运动轨迹
    % cameraParams: 相机参数

    % 选择稳定的轨迹
    stableTrajectories = {
   };
    for i = 1:length(trajectories)
        if length(trajectories{
   i}) > 20
            stableTrajectories{
   end+1} = trajectories{
   i};
        end
    end

    % 三角测量
    points3D = zeros(length(stableTrajectories), size(stableTrajectories{
   1}, 1), 3);
    for i = 1:length(stableTrajectories)
        traj = stableTrajectories{
   i};
        % 使用多视图三角测量计算3D点
        points3D(i, :, :) = triangulateMultiview(traj, cameraParams);
    end

    % 可视化3D轨迹
    figure;
    plot3(squeeze(points3D(:, :, 1)), squeeze(points3D(:, :, 2)), squeeze(points3D(:, :, 3)), 'LineWidth', 2);
    xlabel('X'); ylabel('Y'); zlabel('Z');
    title('3D运动轨迹重建');
    grid on; axis equal;
end

2. 运动目标检测

function detectMovingObjects(videoFrames)
    % 使用背景减除检测运动目标
    backSub = vision.ForegroundDetector('NumGaussians', 3, 'NumTrainingFrames', 50);

    for i = 1:length(videoFrames)
        frame = videoFrames{
   i};
        fgMask = backSub(frame);

        % 形态学操作去除噪声
        se = strel('rectangle', [3, 3]);
        fgMask = imopen(fgMask, se);
        fgMask = imclose(fgMask, se);

        % 显示结果
        figure(1);
        subplot(1,2,1); imshow(frame); title('原始帧');
        subplot(1,2,2); imshow(fgMask); title('运动目标掩码');
        drawnow;
    end
end

3. 行为识别

function recognizeActions(trajectories)
    % 基于轨迹的行为识别
    actions = {
   };

    for i = 1:length(trajectories)
        traj = trajectories{
   i};
        if size(traj, 1) < 10
            continue;
        end

        % 计算运动特征
        displacement = traj(end, :) - traj(1, :);
        distance = norm(displacement);
        direction = atan2(displacement(2), displacement(1));
        speed = distance / size(traj, 1);

        % 计算曲率
        dx = diff(traj(:,1));
        dy = diff(traj(:,2));
        curvatures = zeros(size(dx));
        for j = 2:length(dx)-1
            u = [dx(j), dy(j)];
            v = [dx(j+1), dy(j+1)];
            curvatures(j) = abs(det([u; v])) / (norm(u)^2 * norm(v)^2);
        end
        avgCurvature = mean(curvatures);

        % 行为分类
        if distance < 20
            action = '静止';
        elseif avgCurvature < 0.1
            if abs(direction) < deg2rad(30)
                action = '直行';
            else
                action = '斜向移动';
            end
        else
            if speed > 2
                action = '快速转弯';
            else
                action = '慢速转弯';
            end
        end

        actions{
   end+1} = struct('ID', i, 'Action', action, 'Speed', speed, 'Curvature', avgCurvature);
    end

    % 显示结果
    disp('检测到行为:');
    for i = 1:length(actions)
        fprintf('目标 %d: %s (速度: %.2f px/f, 曲率: %.4f)\n', ...
            actions{
   i}.ID, actions{
   i}.Action, actions{
   i}.Speed, actions{
   i}.Curvature);
    end
end

参考代码 用matlab实现运动图像的运动轨迹检测和特征点跟踪 www.youwenfan.com/contentalh/95860.html

常见问题解决方案

  1. 特征点丢失过多

    • 增加特征点检测数量:points.selectStrongest(200)

    • 降低检测阈值:'MinQuality', 0.005

    • 使用更鲁棒的检测器:detectSURFFeatures

  2. 轨迹漂移严重

    • 减小金字塔层数:NumPyramidLevels', 2

    • 增加窗口大小:'FilterSize', 9

    • 定期重置跟踪器

  3. 实时性能不足

    • 降低图像分辨率

    • 减少跟踪点数量

    • 使用GPU加速

  4. 运动模糊影响跟踪

  • 使用去模糊预处理

  • 增加特征点检测灵敏度

  • 使用更鲁棒的跟踪算法(如KLT)

实际应用

1. 交通监控

% 车辆速度与密度分析
vehicleSpeeds = [];
vehicleDensities = [];

for each trajectory
    if isVehicle(trajectory)
        speed = calculateAverageSpeed(trajectory);
        vehicleSpeeds(end+1) = speed;

        % 在特定区域计数
        if isInRegion(trajectory, regionOfInterest)
            vehicleDensities(end+1) = 1;
        end
    end
end

% 计算交通指标
averageSpeed = mean(vehicleSpeeds);
density = sum(vehicleDensities) / area(regionOfInterest);
flowRate = density * averageSpeed;

2. 体育分析

% 运动员运动模式分析
playerTrajectories = segmentPlayers(trajectories);

for each player
    trajectory = playerTrajectories{
   i};
    heatmap = createMovementHeatmap(trajectory);
    sprintEvents = detectSprints(trajectory);
    positionChanges = analyzeFormationChanges(playerTrajectories);
end

% 战术分析
teamFormation = analyzeTeamFormation(playerTrajectories);
passPredictions = predictPassOpportunities(playerTrajectories);

3. 人机交互

% 手势识别
handTrajectory = trackHand(trajectories);

% 提取手势特征
features = extractGestureFeatures(handTrajectory);

% 分类手势
gesture = classifyGesture(features);

% 执行相应动作
switch gesture
    case 'swipe_left'
        navigateLeft();
    case 'circle'
        activateMenu();
    % ...
end
相关文章
|
存储 缓存 文件存储
如何保证分布式文件系统的数据一致性
分布式文件系统需要向上层应用提供透明的客户端缓存,从而缓解网络延时现象,更好地支持客户端性能水平扩展,同时也降低对文件服务器的访问压力。当考虑客户端缓存的时候,由于在客户端上引入了多个本地数据副本(Replica),就相应地需要提供客户端对数据访问的全局数据一致性。
32713 80
如何保证分布式文件系统的数据一致性
|
前端开发 容器
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局(上)
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局
17766 21
|
设计模式 存储 监控
设计模式(C++版)
看懂UML类图和时序图30分钟学会UML类图设计原则单一职责原则定义:单一职责原则,所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。bad case:IPhone类承担了协议管理(Dial、HangUp)、数据传送(Chat)。good case:里式替换原则定义:里氏代换原则(Liskov 
36697 21
设计模式(C++版)
|
存储 编译器 C语言
抽丝剥茧C语言(初阶 下)(下)
抽丝剥茧C语言(初阶 下)
|
机器学习/深度学习 人工智能 自然语言处理
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
24772 14
|
机器学习/深度学习 弹性计算 监控
重生之---我测阿里云U1实例(通用算力型)
阿里云产品全线降价的一力作,2023年4月阿里云推出新款通用算力型ECS云服务器Universal实例,该款服务器的真实表现如何?让我先测为敬!
36678 15
重生之---我测阿里云U1实例(通用算力型)
|
SQL 存储 弹性计算
Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
|
存储 算法 Java
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的限流器RateLimiter功能服务
随着互联网的快速发展,越来越多的应用程序需要处理大量的请求。如果没有限制,这些请求可能会导致应用程序崩溃或变得不可用。因此,限流器是一种非常重要的技术,可以帮助应用程序控制请求的数量和速率,以保持稳定和可靠的运行。
29849 52

热门文章

最新文章

下一篇
开通oss服务