人脸识别主程序: 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上显示图像呢? 请帮忙解答,谢谢!!!!!!
|