LabelMarkers
给图像的每个连通分量用数字标签标记。
函数接口声明如下:
- 原地操作
HmppResult HMPPI_LabelMarkers_8u_C1IR(uint8_t* pMarker, int markerStep, HmppiSize roiSize, int minLabel, int maxLabel, HmppiNorm norm, int* pNumber);
HmppResult HMPPI_LabelMarkers_16u_C1IR(uint16_t* pMarker, int markerStep, HmppiSize roiSize, int minLabel, int maxLabel, HmppiNorm norm, int* pNumber);
- 非原地操作
HmppResult HMPPI_LabelMarkers_16u8u_C1R(uint16_t* pSrc, int srcMarkerStep, uint8_t* pMarker, int dstMarkerStep, HmppiSize roiSize, int minLabel, int maxLabel, HmppiNorm norm, int* pNumber);
参数名 |
描述 |
取值范围 |
输入/输出 |
|---|---|---|---|
pMarker |
指向源图像和目标图像感兴趣区域的指针(原地操作)。 |
非空 |
输入,输出 |
markerStep |
源图像中连续行的起点之间的距离(以字节为单位)。 |
非负整数 |
输入 |
roiSize |
源图像和目标图像感兴趣区域的大小(以像素为单位)。 |
roiSize.width∈(0, INT_MAX],roiSize.height∈(0, INT_MAX] |
输入 |
minLabel |
最小标签值。 |
minLabel∈[1, 255], minLabel <= maxLabel |
输入 |
maxLabel |
最大标签值。 |
maxLabel∈[1, 255], minLabel <= maxLabel |
输入 |
pSrcMarker |
指向源图像感兴趣区域的指针(非原地操作)。 |
非空 |
输入 |
pMarker |
指向目标图像感兴趣区域的指针(非原地操作)。 |
非空 |
输出 |
srcMarkerStep |
源图像中连续行的起点之间的距离(以字节为单位)。 |
非负整数 |
输入 |
dstMarkerStep |
目标图像中连续行的起点之间的距离(以字节为单位)。 |
非负整数 |
输入 |
norm |
标志使用4连接还是8连接方式计算连通分量。 |
HMPP_NORML1, HMPP_NORMINF, 其中L1代表4连接,INF代表8连接 |
输入 |
pNumber |
指向连通分量数量的指针。 |
非空 |
输出 |
返回值
- 成功:返回HMPP_STS_NO_ERR。
- 失败:返回错误码。
错误码
错误码 |
描述 |
|---|---|
HMPP_STS_NULL_PTR_ERR |
pMarker,pSrcMarker中存在空指针。 |
HMPP_STS_STEP_ERR |
markerStep小于或等于0。 |
HMPP_STS_BAD_ARG_ERR |
minLabel, maxLabel不在[1, 255]范围内或minLabel > maxLabel。 |
HMPP_STS_SIZE_ERR |
roiSize.width或roiSize.height小于或等于0。 |
HMPP_STS_MALLOC_FAILED |
使用的辅助缓冲区分配失败。 |
示例
#include <stdio.h>
#include "hmppi.h"
#include "hmpp_type.h"
void LabelMarkersExample()
{
HmppiSize roi = {7, 6};
uint8_t srcDst[50] = { 0, 0, 0, 0, 1, 1, 0,
0, 1, 1, 0, 1, 1, 0,
0, 1, 1, 0, 1, 1, 0,
0, 0, 0, 0, 1, 1, 0,
0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1,
};
int32_t srcDstStep = 7 * sizeof(uint8_t);
HmppiPoint seed = {3, 3};
uint8_t minLabel = 1;
uint8_t maxLabel = 8;
HmppiNorm norm = HMPP_NORML1;
int number;
HmppResult res = HMPPI_LabelMarkers_8u_C1IR(srcDst, srcDstStep, roi, minLabel, maxLabel,norm, &number);
printf("result: %d\n", (int)res);
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 7; j++) {
printf("%d ", srcDst[i * 7 + j]);
}
printf("\n");
}
}
int main()
{
LabelMarkersExample();
return 0;
}
运行结果:
result: 0 0 0 0 0 1 1 0 0 2 2 0 1 1 0 0 2 2 0 1 1 0 0 0 0 0 1 1 0 0 0 3 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0