直接从图像处理这块进行学习不是特别适应,以前做单片机时由于单片机的片内资源不是特别多,所以对片内资源掌握的比较好,相关的寄存器配置等都是从底层自己配置,现在学习DSP反而不知道怎样从硬件入手了,只能从顶层向底层倒着来摸索。这是一个简单的图像处理程序,仔细看看,很多地方不懂,只能先了解大概,很多地方可能还没有认识到,在以后的学习中再接着摸索。在源程序的基础之上我加了一些注释,程序如下:

  1 /********************************************************************/
  2 /*                        灰度图
  3 运行结果:在屏幕之中画出一块区域显示灰度图像                                    */
  4 /********************************************************************/
  5 /* 关于csl:
  6 1,用于配置、控制和管理DSP片上外设
  7 2,已为C6000和C5000系列DSP设计了各自的CSL库
  8 3,CSL库函数大多数是用C语言编写的,并已对代码的大小和速度进行了优化
  9 4,CSL库是可裁剪的:即只有被使用的CSL模块才会包含进应用程序中
 10 5,CSL库是可扩展的:每个片上外设的API相互独立,增加新的API,对其他片上外设没有影响  */
 11 #include <csl.h>                 /* 总库,提供外设接口和基本配置 */
 12 // 具体的接口定义,头文件中定义了接口的地址等
 13 #include <csl_emifa.h>           /* emifa是一种64位的外部接口,可连接64/32/16/8bit的器件 */
 14 #include <csl_i2c.h>              /* 一种两线式串行总线 */
 15 #include <csl_gpio.h>             /* 也是一种通用的输入输出接口 */
 16 #include <csl_irq.h>             /* 一些基本中断的定义 */
 17 #include <csl_chip.h>
 18 #include <csl_dat.h>
 19 #include "iic.h"
 20 #include "vportcap.h"
 21 #include "vportdis.h"
 22 #include "sa7121h.h"             /* SAA7121可以将数字信号编程模拟信号和下面的编码芯片一样都采用iic总线 */
 23 #include "TVP51xx.h"             /* 视频编码芯片,将模拟信号进行数字化,这是其进行配置的头文件 */
 24 /*SEEDDM642的emifa的设置结构*/
 25 EMIFA_Config Seeddm642ConfigA ={
 26        0x00052078,/*gblctl EMIFA(B)global control register value */
 27                      /*将CLK6、4、1使能;将MRMODE置1;使能EK2EN,EK2RATE*/
 28        0xffffffd3,/*cectl0 CE0 space control register value*/
 29                      /*将CE0空间设为SDRAM*/
 30        0x73a28e01,/*cectl1 CE1 space control register value*/
 31                      /*Read hold: 1 clock;
 32                        MTYPE : 0000,选择8位的异步接口
 33                        Read strobe :001110;14个clock宽度
 34                        TA:2 clock; Read setup 2 clock;
 35                        Write hold :2 clock; Write strobe: 14 clock
 36                        Write setup :7 clock
 37                        --                     ---------------
 38                            /         14c        /1c
 39                            /----------------/ */
 40        0x22a28a22, /*cectl2 CE2 space control register value*/
 41        0x22a28a42, /*cectl3 CE3 space control register value*/
 42        0x57115000, /*sdctl SDRAM control register value*/
 43        0x0000081b, /*sdtim SDRAM timing register value*/
 44        0x001faf4d, /*sdext SDRAM extension register value*/
 45        0x00000002, /*cesec0 CE0 space secondary control register value*/
 46        0x00000002, /*cesec1 CE1 space secondary control register value*/
 47        0x00000002, /*cesec2 CE2 space secondary control register value*/
 48        0x00000073 /*cesec3 CE3 space secondary control register value*/
 49 };
 50 /*SEEDDM642的IIC的设置结构*/
 51 I2C_Config SEEDDM642IIC_Config = {
 52     0,  /* master mode,  i2coar;采用主模式   */
 53     0,  /* no interrupt, i2cimr;只写,不读,采用无中断方式*/
 54     (20-5), /* scl low time, i2cclkl;  */
 55     (20-5), /* scl high time,i2cclkh;  */
 56     1,  /* configure later, i2ccnt;*/
 57     0,  /* configure later, i2csar;*/
 58     0x4ea0, /* master tx mode,     */
 59             /* i2c runs free,      */
 60             /* 8-bit data + NACK   */
 61             /* no repeat mode      */
 62     (75-1), /* 4MHz clock, i2cpsc  */
 63 };
 64 CHIP_Config SEEDDM642percfg = {
 65     CHIP_VP2+/
 66     CHIP_VP1+/
 67     CHIP_VP0+/
 68     CHIP_I2C
 69 };
 70 I2C_Handle hSeeddm642i2c;
 71 int portNumber;
 72 extern SA7121H_ConfParams sa7121hPAL[45];
 73 extern SA7121H_ConfParams sa7121hNTSC[45];
 74 Uint8 vFromat = 0;
 75 Uint8 misc_ctrl = 0x6D;
 76 Uint8 output_format = 0x47;
 77 // 地址为0 for cvbs port1,选择复合信号做为输入
 78 Uint8 input_sel = 0x00;
 79 /*地址为0xf,将Pin27设置成为CAPEN功能*/
 80 Uint8 pin_cfg = 0x02;
 81 /*地址为1B*/
 82 Uint8 chro_ctrl_2 = 0x14;
 83 /*图像句柄的声明*/
 84 VP_Handle vpHchannel0;
 85 VP_Handle vpHchannel1;
 86 VP_Handle vpHchannel2;
 87 /*确定图像的参数*/
 88 int numPixels = 720;//每行720个像素
 89 int numLines  = 576;//每帧576行(PAL)
 90
 91 /*确定处理的范围*/
 92 /*A             */
 93 /*              */
 94 /*             D*/
 95 int intAPixels = 190;
 96 int intALines = 59;
 97 int intDPixels = 530;
 98 int intDLines = 229;
 99 /******************************/
100 /*****画矩形边框函数的声明*****/
101 void drawRectangle();
102 /*消去彩色*/
103 void removeColor();
104 /*采集与显示缓冲区的首址*/
105 Uint32 capYbuffer  = 0x80000000;
106 Uint32 capCbbuffer = 0x800675c0;
107 Uint32 capCrbuffer = 0x8009b0a0;
108 Uint32 disYbuffer  = 0x80100000;
109 Uint32 disCbbuffer = 0x801675c0;
110 Uint32 disCrbuffer = 0x8019b0a0;
111 Uint32 tempYbuffer  = 0x80200000;   //临时
112 Uint32 tempCbbuffer = 0x80300000;   //临时
113 Uint32 tempCrbuffer = 0x80400000;   //临时
114 /*图像格式标志*/
115 Uint8 NTSCorPAL = 0;
116 extern far void vectors();
117 extern volatile Uint32 capNewFrame;
118 extern volatile Uint32 disNewFrame;
119 /*此程序可将四个采集口的数据经过Video Port0送出*/
120 void main()
121 {
122     Uint8 addrI2C;
123     int i;
124
125 /*-------------------------------------------------------*/
126 /* perform all initializations                           */
127 /*-------------------------------------------------------*/
128     /*Initialise CSL,初始化CSL库*/
129     CSL_init();
130     CHIP_config(&SEEDDM642percfg);
131 /*----------------------------------------------------------*/
132     /*EMIFA的初始化,将CE0设为SDRAM空间,CE1设为异步空间
133      注,DM642支持的是EMIFA,而非EMIF*/
134     EMIFA_config(&Seeddm642ConfigA);
135 /*----------------------------------------------------------*/
136     /*中断向量表的初始化*/
137     //Point to the IRQ vector table
138     IRQ_setVecs(vectors);
139     IRQ_nmiEnable();
140     IRQ_globalEnable();
141     IRQ_map(IRQ_EVT_VINT1, 11);
142     IRQ_map(IRQ_EVT_VINT0, 12);
143     IRQ_reset(IRQ_EVT_VINT1);
144     IRQ_reset(IRQ_EVT_VINT1);
145     /*打开一个数据拷贝的数据通路*/
146     DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);
147 /*----------------------------------------------------------*/
148     /*进行IIC的初始化*/
149     hSeeddm642i2c = I2C_open(I2C_PORT0,I2C_OPEN_RESET);
150     I2C_config(hSeeddm642i2c,&SEEDDM642IIC_Config);
151 /*----------------------------------------------------------*/
152     /*进行TVP5150pbs的初始化*/
153     /*选择TVP5150,设置第三通路*/
154     GPIO_RSET(GPGC,0x0);/*将GPIO0不做为GPINT使用*/
155     GPIO_RSET(GPDIR,0x1);/*将GPIO0做为输出*/
156     GPIO_RSET(GPVAL,0x0);/*GPIO0输出为高,选择IIC1总线,配置
157                            第二路,即为U21*/
158     addrI2C = 0xBA >>1;
159     _IIC_write(hSeeddm642i2c, addrI2C,0x00, input_sel);
160     _IIC_write(hSeeddm642i2c, addrI2C,0x03, misc_ctrl);
161     _IIC_write(hSeeddm642i2c, addrI2C,0x0D, output_format);
162     _IIC_write(hSeeddm642i2c, addrI2C,0x0F, pin_cfg);
163     _IIC_write(hSeeddm642i2c, addrI2C,0x1B, chro_ctrl_2);
164     /*回读当前摄像设备的格式*/
165     _IIC_read(hSeeddm642i2c, addrI2C,0x8c, &vFromat);
166     vFromat = vFromat & 0xff;
167     switch (vFromat)
168     {
169         case TVP51XX_NTSCM:
170         case TVP51XX_NTSC443:
171             NTSCorPAL = 1;/*系统为NTSC的模式*/
172             break;
173         case TVP51XX_PALBGHIN:
174         case TVP51XX_PALM:
175             NTSCorPAL = 0;/*系统为PAL的模式*/
176             break;
177         default:
178             NTSCorPAL = 2;/*系统为不支持的模式*/
179             break;
180     }
181     if(NTSCorPAL ==2)
182     {
183         /*系统不支持的模式,重新配置*/
184         for(;;)
185         {}
186     }
187 /*----------------------------------------------------------*/
188     /*进行SAA7121H的初始化*/
189     GPIO_RSET(GPVAL,0x0);/*GPIO0输出为低,选择IIC1总线,配置图像输出*/
190     addrI2C = 0xB8 >>1; /*选择第0路的I2C的地址*/
191     /*将第0路的视频输入口的数据口设为高阻状态,
192       使能SCLK,将第27脚设为输入*/
193     _IIC_write(hSeeddm642i2c, addrI2C,0x03, 0x1);
194     /*配置SAA7121H*/
195     GPIO_RSET(GPVAL,0x1);/*GPIO0输出为低,选择IIC1总线,配置图像输出*/
196     /*初始化Video Port0*/
197     /*将Vedio Port1设为encoder输出*/
198     portNumber = 0;
199     vpHchannel0 = bt656_8bit_ncfd(portNumber);
200     addrI2C = 0x88 >>1;
201     for(i =0; i<43; i++)
202     {
203         if(NTSCorPAL == 1)
204         {
205             _IIC_write(hSeeddm642i2c,
206                        addrI2C,
207                        (sa7121hNTSC[i].regsubaddr),
208                        (sa7121hNTSC[i].regvule));
209         }
210         else
211         {
212             _IIC_write(hSeeddm642i2c,
213                        addrI2C,
214                        (sa7121hPAL[i].regsubaddr),
215                        (sa7121hPAL[i].regvule));
216         }
217     }
218
219 /*----------------------------------------------------------*/
220     /*初始化Video Port1*/
221     /*将Vedio Port1设为采集输入*/
222     portNumber = 1;
223     vpHchannel1 = bt656_8bit_ncfc(portNumber);
224     bt656_capture_start(vpHchannel1);
225     /*等待第一帧数据采集完成*/
226     while(capNewFrame == 0){}
227     /*采集完成,将数据存入显示缓冲区,并清采集完成的标志*/
228     capNewFrame =0;
229     for(i=0;i<numLines;i++)
230     {
231         /*传送临时Y缓冲区*/
232         DAT_copy((void *)(capYbuffer + i * numPixels),
233                  (void *)(tempYbuffer + i * numPixels),
234                  numPixels);
235         /*传送临时Cb缓冲区*/
236         DAT_copy((void *)(capCbbuffer + i * (numPixels >> 1)),
237                  (void *)(tempCbbuffer + i * (numPixels >> 1)),
238                  numPixels>>1);
239         /*传送临时Cr缓冲区*/
240         DAT_copy((void *)(capCrbuffer + i * (numPixels >> 1)),
241                  (void *)(tempCrbuffer + i * (numPixels >> 1)),
242                  numPixels>>1);
243      }
244 /* 画边框,消去彩色灯操作都需要在缓冲区中进行 */
245     /*画边框*/
246     drawRectangle();
247
248     /*消去彩色*/
249     removeColor();
250 /* 再将缓冲区的内容送入显示区 */
251     for(i=0;i<numLines;i++)
252     {
253         /*传送Y缓冲区*/
254         DAT_copy((void *)(tempYbuffer + i * numPixels),
255                  (void *)(disYbuffer + i * numPixels),
256                  numPixels);
257         /*传送Cb缓冲区*/
258         DAT_copy((void *)(tempCbbuffer + i * (numPixels >> 1)),
259                  (void *)(disCbbuffer + i * (numPixels >> 1)),
260                  numPixels>>1);
261         /*传送Cr缓冲区*/
262         DAT_copy((void *)(tempCrbuffer + i * (numPixels >> 1)),
263                  (void *)(disCrbuffer + i * (numPixels >> 1)),
264                  numPixels>>1);
265      }
266
267
268     /*启动显示模块*/
269     bt656_display_start(vpHchannel0);
270     /*建立一个死循环实时采集和播放*/
271     for(;;)
272     {
273         /*当采集区的数据已经采集好,而显示缓冲区的数据已空*/
274         if((capNewFrame == 1)&&(disNewFrame == 1))
275         {
276             /*将数据装入显示缓冲区,并清采集完成的标志*/
277             capNewFrame =0;
278             disNewFrame =0;
279             for(i=0;i<numLines;i++)
280             {
281                 /*传送临时Y缓冲区*/
282                 DAT_copy((void *)(capYbuffer + i * numPixels),
283                          (void *)(tempYbuffer + i * numPixels),
284                          numPixels);
285                 /*传送临时Cb缓冲区*/
286                 DAT_copy((void *)(capCbbuffer + i * (numPixels >> 1)),
287                          (void *)(tempCbbuffer + i * (numPixels >> 1)),
288                          numPixels>>1);
289                 /*传送临时Cr缓冲区*/
290                 DAT_copy((void *)(capCrbuffer + i * (numPixels >> 1)),
291                          (void *)(tempCrbuffer + i * (numPixels >> 1)),
292                          numPixels>>1);
293              }
294
295             /*画边框*/
296             drawRectangle();
297
298             /*消去彩色*/
299             removeColor();
300
301             for(i=0;i<numLines;i++)
302             {
303                 /*传送Y缓冲区*/
304                 DAT_copy((void *)(tempYbuffer + i * numPixels),
305                          (void *)(disYbuffer + i * numPixels),
306                          numPixels);
307                 /*传送Cb缓冲区*/
308                 DAT_copy((void *)(tempCbbuffer + i * (numPixels >> 1)),
309                          (void *)(disCbbuffer + i * (numPixels >> 1)),
310                          numPixels>>1);
311                 /*传送Cr缓冲区*/
312                 DAT_copy((void *)(tempCrbuffer + i * (numPixels >> 1)),
313                          (void *)(disCrbuffer + i * (numPixels >> 1)),
314                          numPixels>>1);
315              }
316
317         }
318
319     }
320
321     for(;;)
322     {}
323   /*----------------------------------------------------------*/
324     /*采集与回放*/
325
326 }
327
328 /*画矩形边框函数的定义*/
329 void drawRectangle()
330 {
331     int i,j;
332     /*画上边*/
333     //奇数行
334     for(i=intALines-4;i<intALines;i++)
335     {
336         for(j=intAPixels-6;j<intDPixels+6;j++)
337         {
338              *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
339         }
340     }
341
342     //偶数行
343     for(i=numLines/2+intALines-4;i<numLines/2+intALines;i++)
344     {
345         for(j=intAPixels-6;j<intDPixels+6;j++)
346         {
347              *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
348         }
349     }
350
351     /*画下边*/
352     //奇数行
353     for(i=intDLines;i<intDLines+4;i++)
354     {
355         for(j=intAPixels-6;j<intDPixels+6;j++)
356         {
357              *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
358         }
359     }
360
361     //偶数行
362     for(i=numLines/2+intDLines;i<numLines/2+intDLines+4;i++)
363     {
364         for(j=intAPixels-6;j<intDPixels+6;j++)
365         {
366              *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
367         }
368     }
369
370     /*画左边*/
371     //奇数行
372     for(i=intALines;i<intDLines;i++)
373     {
374         for(j=intAPixels-6;j<intAPixels;j++)
375         {
376              *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
377         }
378     }
379
380     //偶数行
381     for(i=numLines/2+intALines;i<numLines/2+intDLines;i++)
382     {
383         for(j=intAPixels-6;j<intAPixels;j++)
384         {
385              *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
386         }
387     }
388
389
390     /*画右边*/
391     //奇数行
392     for(i=intALines;i<intDLines;i++)
393     {
394         for(j=intDPixels;j<intDPixels+6;j++)
395         {
396              *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
397         }
398     }
399
400     //偶数行
401     for(i=numLines/2+intALines;i<numLines/2+intDLines;i++)
402     {
403         for(j=intDPixels;j<intDPixels+6;j++)
404         {
405              *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
406         }
407     }
408 }
409 /*消去彩色*/
410 void removeColor()
411 {
412     int i,j;
413     //方框内奇数行
414     for(i=intALines;i<intDLines;i++)
415     {
416         for(j=intAPixels/2;j<intDPixels/2;j++)
417         {
418             *(Uint8 *)(tempCbbuffer + i * (numPixels >> 1) + j) =  0x80;
419             *(Uint8 *)(tempCrbuffer + i * (numPixels >> 1) + j) =  0x80;
420         }
421     }
422
423     //方框内偶数行
424     for(i=numLines/2+intALines;i<numLines/2+intDLines;i++)
425     {
426         for(j=intAPixels/2;j<intDPixels/2;j++)
427         {
428             *(Uint8 *)(tempCbbuffer + i * (numPixels >> 1) + j) =  0x80;
429             *(Uint8 *)(tempCrbuffer + i * (numPixels >> 1) + j) =  0x80;
430         }
431     }
432 }
433
434  

DM642图像处理程序的主要结构相关推荐

  1. 基于qml创建最简单的图像处理程序(1)-基于qml创建界面

    <基于qml创建最简单的图像处理程序>系列课程及配套代码 基于qml创建最简单的图像处理程序(1)-基于qml创建界面 http://www.cnblogs.com/jsxyhelu/p/ ...

  2. 从零开始写一个图像处理程序之四(Prewitt 算子分析)

    上一篇: 从零开始写一个图像处理程序之三(卷积原理简介)_星空_MAX的博客-CSDN博客 具体看看卷积核为什么能够得到图像信息呢 先看Prewitt算子的结构 分别过滤出来横向边缘和纵向边缘: 拿G ...

  3. 基于MFC SDI的图像处理程序(带效果图)

    基于MFC SDI的图像处理程序(带效果图) 收藏 本程序主要实现了位图的打开保存,JPG格式作为BMP格式,以及24位BMP转化到8位.4位.1位(黑白图)及灰度图.还有一些简单的算法如反色,采用高 ...

  4. 打开程序时固定位置_新手入门第五课:免费开源图像处理程序GIMP之矩形选择工具...

    GIMP是一款图像处理软件,是跟Photoshop同一类型的软件,为了方便介绍,后面每篇相关GIMP图像处理软件的介绍文章的开头,我都将插入一段文字,用于介绍GIMP是什么,让不熟悉的朋友知道这是干什 ...

  5. GIMP - GNU 图像处理程序 - 颜色拾取工具

    GIMP - GNU 图像处理程序 - 颜色拾取工具 1. 选择 颜色拾取工具 2. 在图片上选取要拾取位置的颜色,前景颜色会跟着改变 3. 选择画笔工具,在图片上绘制的是选取的颜色 4. 工具选项 ...

  6. [图像处理] 利用PerlinNoise实现图像雾化效果 - 附我的图像处理程序(三种特效)

    时间:2017年7月2日(大三下学期) 写在前面: 最近觉得Steam的软件界面非常的美观,尤其是图片的渐隐.雾化效果看起来非常漂亮.无奈我PS技术不行,手笨做不出那样的效果-- 于是,我就自己写了一 ...

  7. DM642图像平移程序学习

    DM642的图像平移程序,刚开始没明白为什么平移要分为两个半屏来平移,后来琢磨了一下不知道理解对不对,先上程序: /*确定图像的参数*/ int numPixels = 720;//每行720个像素 ...

  8. (GO_GTD_1)基于OpenCV和QT,建立Android图像处理程序

    一.创建新QT工程 一定要是全英文路径,比如"E:\android_qt_opencv\GO_GTD" 由于我们在安装的时候,选择android的工具链,所以在这里会出现以下选择, ...

  9. GIMP - GNU 图像处理程序 用户手册

    法律提示 Permission is granted to copy, distribute and/or modify this document under the terms of the GN ...

  10. python opencv图像处理程序_Python-OpenCV学习(四):基本图像处理

    转载请注明出处:danscarlett的博客园 参考资料: 目录: 读取 imread 显示 imshow 存储 imwrite 缩放 resize 加边框 copyMakeBorder 裁剪 img ...

最新文章

  1. 【Qt】Qt5.9.0: error: GL/gl.h: 没有那个文件或目录
  2. OpenCV Canny边缘检测
  3. Exception in thread main java.lang.NullPointerException
  4. oraclr 和mysql的不同_Mysql和Oracle中的不同
  5. 组播、IGMP、IGMP Snooping
  6. Spring :Spring Aop 创建代理
  7. 大学c语言第三章作业,c语言程序设计一章部分和第三章习题答案.doc
  8. URI和URL、URN的区别
  9. HP FC MSA2000服务器raid数据恢复成功案例
  10. 21天学通python 第2版_21天学通Python(第2版)
  11. django-数据库[ 基本操作 ]
  12. hadoop安装(包含hive)
  13. InstallShield
  14. Ubuntu18.04 配置nvidia 460驱动、cuda10.1和cudnn7.6.5
  15. cacheable更新_Spring之缓存注解@Cacheable
  16. 云教室桌面虚拟化环境搭建——flexVDI Dashboard 3.0 云桌面管理系统的使用
  17. loss.item()大坑
  18. Ubuntu 1804 切换国内源
  19. 初学者如何选择开发语言
  20. ShaderLearning_3_UnityShader基本架构

热门文章

  1. html字体溢出问题,CSS教程:关于文字溢出问题的研究
  2. 泰森怎么会输给道格拉斯_揭秘:泰森惨败给道格拉斯之后,为何不去打二番战复仇...
  3. go标准库的学习-encoding/base64
  4. MYSQL 解压版5.7.12安装和客户端连接。
  5. Grunt usemin前端自动化打包流程
  6. 函数 php_PHP丨PHP基础知识之PHP基础入门——函数「理论篇」
  7. phpexcel如何预览数据_可变数据之流水号数据的批量制作与打印
  8. python 从入门到实践_Python编程从入门到实践日记Day36
  9. html代码向下移动,在html表格中向下移动Jquery
  10. pyqt qdialog 默认按钮_QT编程的QDialog对话框右上角的问号按钮如何取消呢