Benz

Benz

0个粉丝

29

问答

0

专栏

0

资料

Benz  发布于  2017-11-30 19:43:14
采纳率 0%
29个问答
3965

提取Y分量,代码有些处不理解,还请指点一二,谢谢

 
本帖最后由 Benz 于 2017-11-30 19:46 编辑

通过调用HI_MPI_VI_GetFrame获取到原始数据帧,然后提取其中的Y分量;
代码如下:
void save_Y(VIDEO_FRAME_S * pVBuf, FILE *pfd, unsigned int buffer[256], unsigned int* block_info, unsigned char usr_data, bool type)
{

        unsigned int h, w;
        char * pMemContent;
#ifdef TEST
        unsigned char TmpBuff[MAX_FRM_WIDTH];               
#endif

        unsigned int num = 0;
        char * pVBufVirt_Y;    //char*定义的地址
        char * pVBufVirt_C;
        HI_U32 phy_addr, size;
        HI_CHAR *pUserPageAddr[2];
        PIXEL_FORMAT_E  enPixelFormat = pVBuf->enPixelFormat;
        HI_U32 u32UvHeight;

        if (pVBuf->u32Width > MAX_FRM_WIDTH)
        {
                printf("Over max frame width: %d, can't support.\n", MAX_FRM_WIDTH);
                return;
        }

        if (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == enPixelFormat)
        {
                u32UvHeight = pVBuf->u32Height/2;
        }
        else
        {
                u32UvHeight = pVBuf->u32Height;
        }
        size = (pVBuf->u32Stride[0])*(pVBuf->u32Height)+(pVBuf->u32Stride[1])*u32UvHeight;

        phy_addr = pVBuf->u32PhyAddr[0];

        printf("phy_addr:%x, size:%d\n", phy_addr, size);
        pUserPageAddr[0] = (HI_CHAR *) HI_MPI_SYS_Mmap(phy_addr, size);
        if (NULL == pUserPageAddr[0])
        {
                return;
        }
        // printf("stride: %d,%d\n",pVBuf->u32Stride[0],pVBuf->u32Stride[1] );

        //Y 分量的起始地址
        pVBufVirt_Y = pUserPageAddr[0];
        //UV分量的起始地址
        pVBufVirt_C = pVBufVirt_Y + (pVBuf->u32Stride[0])*(pVBuf->u32Height);


        //统计所有像素点的亮度值的个数,比如亮度为128的有多少个,为186的有多少个...
        if(type)
        {
                for(num = 0; num < 1280*720; num++)
                {
                        printf("pVBufVirt_Y[num] = %d\n", pVBufVirt_Y[num]);     //输出的数据是0-255,求解,定义的地址类型不是char*吗?范围不应该是在-128-127吗?
                        //buffer[(unsigned char)pVBufVirt_Y[num]]++;
                }
        }
        HI_MPI_SYS_Munmap(pUserPageAddr[0], size);
}
我来回答
回答10个
时间排序
认可量排序

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2017-11-30 20:40:03
认可0
都是正的吧,负的也得弄成正的

负的正的有啥区别,反正都是255个灰度等级

Benz

0个粉丝

29

问答

0

专栏

0

资料

Benz 2017-12-05 09:28:14
认可0
本帖最后由 Benz 于 2017-12-5 09:29 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=81437&ptid=38342]ngswfx 发表于 2017-11-30 20:40[/url]
都是正的吧,负的也得弄成正的

负的正的有啥区别,反正都是255个灰度等级[/quote]

您好,谢谢回复。我是想知道为什么char定义的指针里面数据为啥是0-255,不明白。

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2017-12-05 09:44:14
认可0
本帖最后由 ngswfx 于 2017-12-5 09:46 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=81609&ptid=38342]Benz 发表于 2017-12-5 09:28[/url]
您好,谢谢回复。我是想知道为什么char定义的指针里面数据为啥是0-255,不明白。[/quote]

一看就是学计算机出身的,有疑问,呵呵,我一般遇到这些,就不知道问啥,也没有任何疑问,反正程序展现结果是什么,我就用什么

我可不确定是不是因为printf %d引起的,这个地方好像是个4字节的int,默认强制转换了,另外也不排除:你定义的是什么,和里面当前内容是什么,这东西有没有必然联系

反正这些代码,到处都是坑

Benz

0个粉丝

29

问答

0

专栏

0

资料

Benz 2017-12-05 10:26:27
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=81616&ptid=38342]ngswfx 发表于 2017-12-5 09:44[/url]
一看就是学计算机出身的,有疑问,呵呵,我一般遇到这些,就不知道问啥,也没有任何疑问,反正程序展现 ...[/quote]

我之前写了测试代码,int转换成char也就相当于截取了低8个字节,赋值一个int数据为255,取地址转换成char*,再取char *里面的内容,出来是-1。地址映射那个函数,返回的是VOID*,强制转换成了char*,再赋值给了定义的Y分量地址的。这个地方实在有点懵逼

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-12-05 14:33:44
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=81624&ptid=38342]Benz 发表于 2017-12-5 10:26[/url]
我之前写了测试代码,int转换成char也就相当于截取了低8个字节,赋值一个int数据为255,取地址转换成char ...[/quote]

内存里面的数据实际上是0xff, 至于是255还是-1就看自己怎么看了, 用unsigned char看就是255, 用signed char看就是-1, 这时候内存里面的数据并没有变化

Benz

0个粉丝

29

问答

0

专栏

0

资料

Benz 2017-12-05 15:12:59
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=81672&ptid=38342]zhuangweiye 发表于 2017-12-5 14:33[/url]
内存里面的数据实际上是0xff, 至于是255还是-1就看自己怎么看了, 用unsigned char看就是255, 用signed ch ...[/quote]

对,是这个道理!但是为什么上面的代码里面char*定义的地址里面,用下标访问出来的结果是0-255呢?海思mpp/tools下面的vi_dump.c里面的代码,我只是根据我的需求改了一下,不理解为什么用的char*定义的,但数据却是0-255,还请指点一下,谢谢

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-12-05 15:45:52
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=81673&ptid=38342]Benz 发表于 2017-12-5 15:12[/url]
对,是这个道理!但是为什么上面的代码里面char*定义的地址里面,用下标访问出来的结果是0-255呢?海思mp ...[/quote]

这个问题和编译器的默认选项有关系了
测试代码如下(头文件就不贴了):
void main(int argc, char **argv)
{
        char ch = 0xff;

        char *p = &ch;

        printf("*p = %d \n", (int)p[0]);
}

默认编译
arm-hisiv300-linux-gcc -o test test.c
运行
/var # ./test
*p = 255

换个方法编译
arm-hisiv300-linux-gcc -o test test.c  -fsigned-char
运行
/var # ./test
*p = -1

也就是说海思编译器默认char是无符号的, 楼主可以再试试

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-12-05 15:51:39
认可0
本帖最后由 zhuangweiye 于 2017-12-5 15:53 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=81676&ptid=38342]zhuangweiye 发表于 2017-12-5 15:45[/url]
这个问题和编译器的默认选项有关系了
测试代码如下(头文件就不贴了):
void main(int argc, char **argv ...[/quote]

继续测试
void main(int argc, char **argv)
{
        signed char ch = 0xff;

        signed char *p = &ch;

        printf("*p = %d \n", (int)p[0]);
}
默认编译
arm-hisiv300-linux-gcc -o test test.c
运行
/var # ./test
*p = -1

因此, 一般来说不要用简单的char, 在海思中还是用HI_U8和HI_S8比较好

Benz

0个粉丝

29

问答

0

专栏

0

资料

Benz 2017-12-05 15:55:35
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=81678&ptid=38342]zhuangweiye 发表于 2017-12-5 15:51[/url]
继续测试
void main(int argc, char **argv)
{
[/quote]

厉害了,新大陆啊!谢谢,我试试看   

Benz

0个粉丝

29

问答

0

专栏

0

资料

Benz 2017-12-05 16:44:01
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=81676&ptid=38342]zhuangweiye 发表于 2017-12-5 15:45[/url]
这个问题和编译器的默认选项有关系了
测试代码如下(头文件就不贴了):
void main(int argc, char **argv ...[/quote]

确实如此,十分感谢
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区