热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于RK3066&RK3188BOX4.4.2SDK,外接USB摄像头,像素设置为500万,拍照时右下角出现小块长方形色块。

1、问题见图:和2、解决方法diff--gitahardwarerk29cameraCameraHal_Utils.cppbhardwarerk29cameraCa

1、问题

见图:


2、解决方法

diff --git a/hardware/rk29/camera/CameraHal_Utils.cpp b/hardware/rk29/camera/CameraHal_Utils.cppindex 5b62f9d..a2423d7 100755
--- a/hardware/rk29/camera/CameraHal_Utils.cpp
+++ b/hardware/rk29/camera/CameraHal_Utils.cpp
@@ -193,7 +193,7 @@ extern "C" int rk_camera_zoom_ipp(int v4l2_fmt_src, int srcbuf, int src_w, int s
ipp_req.flag = IPP_ROT_0;
ipp_req.store_clip_mode =1;
ipp_req.src0.w = cropW/scale_w_times;
- ipp_req.src0.h = cropH/scale_h_times;
+ ipp_req.src0.h = cropH/scale_h_times - 8;
ipp_req.src_vir_w = src_w;
ipp_req.src0.fmt = IPP_Y_CBCR_H2V2;
ipp_req.dst0.w = src_w/scale_w_times;
diff --git a/hardware/rk29/camera/MessageQueue.cpp b/hardware/rk29/camera/MessageQueue.cpp
index 61ee1f6..545f1d8 100755
--- a/hardware/rk29/camera/MessageQueue.cpp
+++ b/hardware/rk29/camera/MessageQueue.cpp
@@ -276,4 +276,3 @@ int MessageQueue::dump()

return 0;
}

后话,按照上面的方式修改后图片中间出现分隔线,如图


修改方法如下:

diff --git a/hardware/rk29/camera/CameraHal_Utils.cpp b/hardware/rk29/camera/CameraHal_Utils.cpp
index 5b62f9d..427d5cf 100755
--- a/hardware/rk29/camera/CameraHal_Utils.cpp
+++ b/hardware/rk29/camera/CameraHal_Utils.cpp
@@ -183,7 +183,7 @@ extern "C" int rk_camera_zoom_ipp(int v4l2_fmt_src, int srcbuf, int src_w, int s
 
        //compute zoom 
        cropW = (src_w*100/zoom_value)& (~0x03);
-       cropH = (src_h*100/zoom_value)& (~0x03);
+       cropH = (src_h*100/zoom_value)& (~0x03) - 16;
        left_offset=MAX((((src_w-cropW)>>1)-1),0);
        top_offset=MAX((((src_h-cropH)>>1)-1),0);
        left_offset &= ~0x01; 
diff --git a/hardware/rk29/camera/MessageQueue.cpp b/hardware/rk29/camera/MessageQueue.cpp
index 61ee1f6..545f1d8 100755
--- a/hardware/rk29/camera/MessageQueue.cpp
+++ b/hardware/rk29/camera/MessageQueue.cpp
@@ -276,4 +276,3 @@ int MessageQueue::dump()
 
     return 0;
 }

同时参考如下文档:

在现在312x芯片代码中,少采几行几列:
1):
在rk_camera_setup_format()中:
else{ /* this is one frame mode*/
    //rect->width -= 50;
//rect->height -= 8;
   cif_crop = (rect->left + (rect->top <<16));
   cif_fs = ((rect->width) + ((rect->height) <<16));
}
write_cif_reg(pcdev->base,CIF_CIF_CROP, cif_crop);
write_cif_reg(pcdev->base,CIF_CIF_SET_SIZE, cif_fs);
write_cif_reg(pcdev->base,CIF_CIF_VIR_LINE_WIDTH, rect->width);
write_cif_reg(pcdev->base,CIF_CIF_FRAME_STATUS,  0x00000003);


改成:cif_fs = ((rect->width-8) + ((rect->height-8) <<16));
而不能直接在前面:
rect->width -= 8;
rect->height -= 8;


这里rect->width值后面还写了虚宽寄存器,这个值决定每行采集的宽度,如果CIF_CIF_SET_SIZE设置的采集宽小于这个虚空,那么每一行后面补0;即看到的是绿色;
(rect->height-8),表示每帧少采8行,也是补0;这里其实(rect->width-8),不是必须,每行不必少采集;


但这里这样修改后,会影响前置, 所以oneframe中不修改,还是在后置SP2518.c文件中修改:
static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)
{
SENSOR_TR("--hkw--mf->widthH(%dx%d)-----\n",mf->width,mf->height);
mf->height -= 8; //add
return 0;
}



另外在rk_camera_cifirq()函数中对if(reg_lastline != pcdev->host_height)有校验,所以去掉这边的判断:


pcdev->irqinfo.cifirq_idx++;    
-    if ((reg_lastline != pcdev->host_height) /*|| (reg_lastpix != pcdev->host_width)*/) {
-        pcdev->irqinfo.cifirq_abnormal_idx = pcdev->irqinfo.cifirq_idx;
-        RKCAMERA_DG2("Cif irq-%ld is error, %dx%d != %dx%d\n",pcdev->irqinfo.cifirq_abnormal_idx,
-                    reg_lastpix,reg_lastline,pcdev->host_width,pcdev->host_height);
+    if (0) {//((reg_lastline != pcdev->host_height) /*|| (reg_lastpix != pcdev->host_width)*/) {
+        //pcdev->irqinfo.cifirq_abnormal_idx = pcdev->irqinfo.cifirq_idx;
+       // RKCAMERA_DG2("Cif irq-%ld is error, %dx%d != %dx%d\n",pcdev->irqinfo.cifirq_abnormal_idx,
+                  //  reg_lastpix,reg_lastline,pcdev->host_width,pcdev->host_height);


2):
这样改不管是预览还是拍照尺寸都少采了8行;预览(8行不明显)和拍出来的照片底部均可能有绿条;
预览很可能看不到绿条,是因为预览图片是4:3(800x600)而lcd屏幕不是4:3,这样拿去显示合成时,有做裁剪缩放;
而拍出来的照片一定能看到绿条(1600x1200),
解决办法:
在拍照函数captureEncProcessPicture()中,强制进行RGA缩放,但输入给RGA的源高为实际值:frame->frame_height-16(实际是减8,但RGA需要16对齐);
git diff
diff --git a/CameraHal/AppMsgNotifier.cpp b/CameraHal/AppMsgNotifier.cpp
index eb96fff..686d95f 100755
--- a/CameraHal/AppMsgNotifier.cpp
+++ b/CameraHal/AppMsgNotifier.cpp
@@ -1035,15 +1035,16 @@ int AppMsgNotifier::captureEncProcessPicture(FramInfo_s* frame){
        /*ddl@rock-chips.com: v0.4.7*/
     // bool rotat_180 = false; //used by ipp
     //frame->phy_addr = -1 ,just for isp soc camera used iommu,so ugly...
-    if((frame->frame_fmt == V4L2_PIX_FMT_NV12) && ((frame->frame_width != mPictureInfo.w) || (frame->frame_height != mPictureInfo.h) || (frame->zoom_value != 100) || frame->phy
-        output_phy_addr = rawbuf_phy;
+    //if((frame->frame_fmt == V4L2_PIX_FMT_NV12) && ((frame->frame_width != mPictureInfo.w) || (frame->frame_height != mPictureInfo.h) || (frame->zoom_value != 100) || frame->p
+       if(1){  
+               output_phy_addr = rawbuf_phy;
         output_vir_addr = rawbuf_vir;
         #if 0
         arm_camera_yuv420_scale_arm(V4L2_PIX_FMT_NV12, V4L2_PIX_FMT_NV12, (char*)(frame->vir_addr),
             (char*)rawbuf_vir,frame->frame_width, frame->frame_height,
              jpeg_w, jpeg_h,false,frame->zoom_value);
         #else
-        rga_nv12_scale_crop(frame->frame_width, frame->frame_height, 
+        rga_nv12_scale_crop_cap(frame->frame_width, frame->frame_height-16, 
                             (char*)(frame->vir_addr), (short int *)rawbuf_vir, 
                             jpeg_w,jpeg_w,jpeg_h,frame->zoom_value,false,!mIs_Verifier,false);
         #endif


3):
这样出现拍照的结果:绿条在图片的上方;增加下面的修改,rga的源虚高要以实际的,比如(1600x1200)图片,实际是1200-8,这里Rga_Request.src.vir_h还是1200;

cropW = src_width;
cropH = src_height; //src_height即frame->frame_height-16;
Rga_Request.src.act_w = cropW;
    Rga_Request.src.act_h = cropH;
这样RGA所做的,即从源1600x(1200-8)到1600x1200的裁剪缩放过程;


diff --git a/CameraHal/CameraHalUtil.cpp b/CameraHal/CameraHalUtil.cpp
index f73c7e8..a174156 100755
--- a/CameraHal/CameraHalUtil.cpp
+++ b/CameraHal/CameraHalUtil.cpp
@@ -450,7 +450,7 @@ extern "C" int rga_nv12_scale_crop(int src_width, int src_height, char *src, sho
     Rga_Request.src.uv_addr  = (int)psY;
     Rga_Request.src.v_addr   =  0;
     Rga_Request.src.vir_w =  src_width;
-    Rga_Request.src.vir_h = src_height;
+    Rga_Request.src.vir_h = src_height+16;
     Rga_Request.src.format = RK_FORMAT_YCbCr_420_SP;
     Rga_Request.src.act_w = cropW;
     Rga_Request.src.act_h = cropH;




4)
但是这个rga_nv12_scale_crop()不仅在拍照时使用,zoom等其他场合可能都用了,所以这里单独增加一个给拍照时用的RGA函数:
2) 中:rga_nv12_scale_crop()
改成:
rga_nv12_scale_crop_cap()
3)中:
rga_nv12_scale_crop()改回去,增加rga_nv12_scale_crop_cap()函数;区别是:
-    Rga_Request.src.vir_h = src_height;
+    Rga_Request.src.vir_h = src_height+16;

CameraHal.h中增加声明:
diff --git a/CameraHal/CameraHal.h b/CameraHal/CameraHal.h
index f1e8e8c..505f22e 100755
--- a/CameraHal/CameraHal.h
+++ b/CameraHal/CameraHal.h
@@ -118,6 +118,7 @@ extern "C" int cameraFormatConvert(int v4l2_fmt_src, int v4l2_fmt_dst, const cha
                                                        bool mirror);
                                                        
 extern "C" int rga_nv12_scale_crop(int src_width, int src_height, char *src, short int *dst, int dstbuf_width,int dst_width,int dst_height,int zoom_val,bool mirror,bool isNeedC
+extern "C" int rga_nv12_scale_crop_cap(int src_width, int src_height, char *src, short int *dst, int dstbuf_width,int dst_width,int dst_height,int zoom_val,bool mirror,bool isN
 
 extern rk_cam_info_t gCamInfos[CAMERAS_SUPPORT_MAX];








推荐阅读
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • 如何使用Python从工程图图像中提取底部的方法?
    本文介绍了使用Python从工程图图像中提取底部的方法。首先将输入图片转换为灰度图像,并进行高斯模糊和阈值处理。然后通过填充潜在的轮廓以及使用轮廓逼近和矩形核进行过滤,去除非矩形轮廓。最后通过查找轮廓并使用轮廓近似、宽高比和轮廓区域进行过滤,隔离所需的底部轮廓,并使用Numpy切片提取底部模板部分。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
author-avatar
用户kltt快乐天天
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有