看一个边缘检测的视频程序,(此处大概给个框架,附件中有连续程序)
1 bt656_capture_start(vpHchannel1);
2 for(i=0;i<numLines;i++)
3 { DAT_copy((void *)(capYbuffer + i * numPixels), (void *)(tempSrcYbuffer + i * numPixels), numPixels);
4 DAT_copy((void *)(capYbuffer + i * numPixels), (void *)(tempDisYbuffer + i * numPixels), numPixels); }
5 sobelEdge(); drawRectangle();////图像处理函数
6 for(i=0;i<numLines;i++)
7 { DAT_copy((void *)(tempDisYbuffer + i * numPixels), (void *)(disYbuffer + i * numPixels), numPixels); }
8 bt656_display_start(vpHchannel0);
9 for(;;)
10 { if((capNewFrame == 1)&&(disNewFrame == 1))
11 { capNewFrame =0; disNewFrame =0;
12 for(i=0;i<numLines;i++)
13 { DAT_copy((void *)(capYbuffer + i * numPixels), (void *)(tempSrcYbuffer + i * numPixels), numPixels);
14 DAT_copy((void *)(capYbuffer + i * numPixels), (void *)(tempDisYbuffer + i * numPixels), numPixels); }
15 sobelEdge(); drawRectangle();
16 for(i=0;i<numLines;i++)
17 { DAT_copy((void *)(tempDisYbuffer + i * numPixels), (void *)(disYbuffer + i * numPixels), numPixels); } } }
18 for(;;) {}
有几个问题:
1.定义了视频采集和显示的缓存地址,视频采集后是怎么存到指定的地址的,我在ccs中搜索capYbuffer(视频获取缓冲区),得到8个结果,一个是定义,其他的都是出现在DAT_copy函数中,也就是直接在指定的地址中取视频数据了。而且在不同的开发板例程中,视频缓存区定义的关键词还不一样,除了capYbuffer,还有capYbur等。既然定义视频存储地址关键词不是特定的,就更不好理解为什么视频采集完会存到定义好的区间去。
2.程序中第3行先把获取缓存区capYbuffer中的数据搬到临时缓存tempSrcYbuffer中,第4行又把获取缓存区capYbuffer中的数据搬到临时缓存tempDisYbuffer中,为什么要放到两个临时缓存中?
3.第5行的图像处理函数,处理的是哪个地址里的数据,处理完放哪了?
4.第7行把capYbuffer中的数据搬到临时缓存tempDisYbuffer中数据搬到DisYbuffer中,是要显示吗?我理解的1-7行为图像采集过程,8-18为图像显示过程,为什么在这里就把数据放到显示缓存中了?
5.13-17行又把上面的处理重复了一遍,图像处理函数sobelEdge(); drawRectangle();也加了一遍,可以理解处理了两边吗?
6.数据搬了还几次,我理解的是这样的过程:视频开始采集,然后从采集缓存放到临时缓存,然后加入图像处理函数,然后从临时缓存搬到现实缓存,开始现实。这样的理解显然不能解释程序,我错在哪里?正确的过程是怎么样的。
本来做个硬件平台,例程调通了认为就可以了,结果老师要我写算法,只能从头看,基础不好,周围也没人做这个,只能向各位专家请教了,还望不吝赐教,谢谢!!!