You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C语言求解YUV图像中目标对象的凸包?

从YUV图像计算目标对象凸包的C语言实现步骤

1. 提取目标的坐标点集

你需要先把YUV图像中属于指定目标的像素坐标提取出来,作为凸包算法的输入:

  • 先解析YUV数据:常用的YUV420P格式直接提取亮度Y分量即可满足目标识别需求,如果你已经有目标的二值分割掩码,可直接使用掩码减少计算范围。
  • 限定目标遍历范围:如果提前知道目标的包围盒坐标[x1,y1]到[x2,y2],只遍历该区域即可,不用处理整张图像。
  • 收集目标像素坐标:遍历区域内的像素,将符合目标特征的像素的(x,y)坐标存入数组,坐标统一以图像左上角为原点,x为水平列数、y为垂直行数即可。

优化提示:凸包只和目标最外围的点有关,你可以先对目标做边缘提取,只收集边缘像素坐标,能大幅减少后续凸包计算的运算量,不需要输入所有前景像素。

2. 适配现有凸包算法

你之前找到的支持随机点输入的凸包算法不需要修改核心逻辑,只需要做输入替换即可:

  • 删掉原有生成随机点的代码,将输入的点集替换为上一步提取到的目标坐标数组。
  • 提前对输入点集做去重处理,避免重复坐标增加算法的无用计算量。
  • 坐标数据类型和现有算法对齐即可,像素坐标是整数,如果原有算法支持浮点输入直接做类型转换也不会有精度损失。
  • Graham扫描、Andrew单调链等常用凸包算法都可以直接适配该类点集输入。

3. 关键代码示例

#include <stdint.h>
#include <stdlib.h>

// 点结构体和你现有凸包算法的定义保持一致即可
typedef struct {
    int x;
    int y;
} Point;

// 你现有的凸包算法函数,输入点数组、点数量,输出凸包点数组,返回凸包点个数
extern int convex_hull(Point *points, int n, Point *hull);

int calc_target_convex_hull(uint8_t *yuv_data, int img_w, int img_h, int x1, int y1, int x2, int y2) {
    Point *target_points = malloc(img_w * img_h * sizeof(Point));
    int point_cnt = 0;
    uint8_t *y_buf = yuv_data; // Y分量起始地址

    // 遍历目标区域,收集目标像素坐标
    for (int y = y1; y < y2; y++) {
        for (int x = x1; x < x2; x++) {
            // 此处替换为你判断像素属于目标的逻辑,比如阈值判断、掩码判断
            if (y_buf[y * img_w + x] > 128) {
                target_points[point_cnt++] = (Point){x, y};
            }
        }
    }

    // 调用现有凸包算法
    Point *hull = malloc(point_cnt * sizeof(Point));
    int hull_cnt = convex_hull(target_points, point_cnt, hull);

    // 此处可添加凸包结果的后续处理逻辑

    free(target_points);
    free(hull);
    return hull_cnt;
}

4. 额外优化建议

  • 如果目标尺寸很大,先通过Canny算子提取边缘,仅输入边缘点到凸包算法,运算效率可以提升数倍。
  • 如果需要在YUV图像上可视化凸包结果,直接将凸包点连线位置的Y分量设为高亮值即可,无需转换为RGB格式。

内容的提问来源于stack exchange,提问作者mgoris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:45:03