嵌入式开发者社区
标题: 人脸识别主程序执行流程求助 [打印本页]
作者: lzayy 时间: 2017-3-31 14:45
标题: 人脸识别主程序执行流程求助
人脸识别主程序:
void main(void)
{
......
while (1)
{
/* 等待复制捕获图像到image_buffer */
captured = 1;
while(captured);
GreyTran(image_buffer, gray_buffer);
image->imageData = (char*)gray_buffer;
storage = cvCreateMemStorage(0);
/* 使用OpenCVhaardetect算法*/
dsp_sequence =cvHaarDetectObjects(image, cascade, storage, 2.5, 2, 0, cvSize(30, 30));
/* 复制人脸位置数据缓冲区,用于画人脸位置到每一帧图像 */
for (i = 0; i < 2; i++)
*(dsp_sequence2 + i) = *(dsp_sequence +i);
cvReleaseMemStorage(&storage);
if (error_flag)
{
UARTprintf("Unexpected erroroccured during VPIF loopback\n");
error_flag = 0;
}
}
}
在主循环while (1)中,当执行到while(captured);的时候程序执行死循环,等待VPIF中断服务程序。VPIF中断服务程序如下:
char k=0;
static void VPIFIsr(void)
{
unsigned int temp;
IntEventClear(SYS_INT_VPIF_INT);
temp = VPIFInterruptStatus(SOC_VPIF_0_REGS,VPIF_ERROR_INT | \
VPIF_FRAMEINT_CH3 | \
VPIF_FRAMEINT_CH2 | \
VPIF_FRAMEINT_CH1 | \
VPIF_FRAMEINT_CH0);
if(k>=2)
{
VPIFCaptureChanenDisable(SOC_VPIF_0_REGS,VPIF_CHANNEL_1);
VPIFCaptureChanenDisable(SOC_VPIF_0_REGS,VPIF_CHANNEL_0);
CvRect *r;
CvPoint c1, c2;
unsigned int Blue = 0x001f;
int i;
if(captured == 1)
{
CacheWB((unsigned int)ov2640image,sizeof(ov2640image));
srcBuff = (char *)(ov2640image);
dstBuff = (char *)image_buffer;
EDMA3Test();
captured = 0;
}
else
{
for (i = 0; i < (dsp_sequence2 ?dsp_sequence2->total : 0); i++)
{
r = (CvRect *)cvGetSeqElem(dsp_sequence2, i);
// mark with thick white rectangle
c1.x = r->x;
c1.y = r->y;
c2.x = r->x + r->width;
c2.y = r->y + r->height;
RectDraw(ov2640image, c1.x, c1.y, c2.x,c2.y, Blue);
}
CacheWB((unsigned int)ov2640image,sizeof(ov2640image));
CacheInv((unsigned int)g_pucBuffer,sizeof(g_pucBuffer));
srcBuff = (char *)(ov2640image);
dstBuff = (char*)(g_pucBuffer+PALETTE_OFFSET+PALETTE_SIZE);
EDMA3Test();
}
Reinitov2640();
k=0;
/* 使能捕获 */
VPIFCaptureChanenEnable(SOC_VPIF_0_REGS,VPIF_CHANNEL_0);
VPIFCaptureChanenEnable(SOC_VPIF_0_REGS,VPIF_CHANNEL_1);
}
k++;
/* 中断错误 */
if ((temp & VPIF_ERROR_INT))
{
error_flag = 1;
}
}
在VPIF中断服务程序中当程序执行完:
if(captured == 1)
{
CacheWB((unsigned int)ov2640image,sizeof(ov2640image));
srcBuff = (char *)(ov2640image);
dstBuff = (char *)image_buffer;
EDMA3Test();
captured = 0;
}
后captured = 0;主程序while(captured);死循环解除,主程序向下执行 进行灰度转换和人脸识别区域的处理。
我的问题是,在主程序向下执行 进行灰度转换和人脸识别区域的处理的时候,VPIF中断会不会发生,如果不会发生那么主程序在执行完之后又会执行
captured = 1;
while(captured);
然后等待VPIF中断,在进入VPIF中断后因为captured= 1,所以是不是还是执行
if(captured == 1)
{
CacheWB((unsigned int)ov2640image,sizeof(ov2640image));
srcBuff = (char *)(ov2640image);
dstBuff = (char *)image_buffer;
EDMA3Test();
captured = 0;
}
那么什么时候执行
else
{
for (i = 0; i < (dsp_sequence2 ?dsp_sequence2->total : 0); i++)
{
r = (CvRect *)cvGetSeqElem(dsp_sequence2, i);
// mark with thick white rectangle
c1.x = r->x;
c1.y = r->y;
c2.x = r->x + r->width;
c2.y = r->y + r->height;
RectDraw(ov2640image, c1.x, c1.y, c2.x,c2.y, Blue);
}
CacheWB((unsigned int)ov2640image,sizeof(ov2640image));
CacheInv((unsigned int)g_pucBuffer,sizeof(g_pucBuffer));
srcBuff = (char *)(ov2640image);
dstBuff = (char*)(g_pucBuffer+PALETTE_OFFSET+PALETTE_SIZE);
EDMA3Test();
}
这个语句,不执行这个语句怎么能在LCD上显示图像呢?
请帮忙解答,谢谢!!!!!!
作者: Lewis 时间: 2017-4-1 22:45
VPIF中断会不断的产生,当capture=1的时候,将图像数据复制给DSP做算法处理,当capture=0时,复制到LCD显示
作者: lzayy 时间: 2017-4-2 13:55
这样会不会出现算法处理的图像,和要显示的图像不一致呢?再有能不能将算法放到VFIP中断中处理?
作者: human 时间: 2017-4-2 17:31
数据处理完capture=0
中断服务函数一般不做复杂的处理
作者: lzayy 时间: 2017-4-2 20:50
以前感觉自己dsp编程还行,也能完成一些比较复杂的项目,可是这次一遇到算法就蒙了,主程序和中断程序的乒乓操作一时间还是不能适应。不理解。
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |