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

1、问题

见图:

2、解决方法

diff --git a/hardware/rk29/camera/CameraHal_Utils.cpp b/hardware/rk29/camera/CameraHal_Utils.cpp
index 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;
 }

同时参考如下文档:

在现在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){
        /*[email protected]: 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];

时间: 2024-08-01 14:01:48

关于RK3066&RK3188 BOX 4.4.2 SDK,外接USB摄像头,像素设置为500万,拍照时右下角出现小块长方形色块。的相关文章

安卓SDK安装时出现的小问题

在SDK Manager启动安装后出现网页不能访问的错误 错误日志如下 Fetching URL: https://dl-ssl.google.com/android/repository/repository-6.xmlFetching URL: https://dl-ssl.google.com/android/repository/addon.xmlDone loading packages. 看这个提示应该判断为不能访问google了 找访问google的代理找了许久.... 最终测试 

如何制作Ubuntu SDK Live USB盘

对于一些想开发Ubuntu手机应用或Scope的开发者来说,不想重新买一个电脑安装Ubuntu操作系统或在自己的硬盘上重新安装一个Ubuntu系统,那么可以考虑制作一个Ubuntu系统的Live USB盘.这个USB包括如下的部分: Ubuntu Kylin 14.10操作系统 Ubuntu SDK (包括已经安装好的SDK,模拟器及编译环境) 使用这个Live USB盘,开发者就不用安装任何的东西,直接插入电脑的USB口中.在电脑启动的过程中,选择我们制作好的USB启动盘进行启动(在电脑启动的

虹软人脸识别SDK在网络摄像头中的实际应用

目前在人脸识别领域中,网络摄像头的使用很普遍,但接入网络摄像头和人脸识别SDK有一定门槛,在此文章中有介绍过虹软人脸识别SDK的接入流程,本文着重介绍网络摄像头获取视频流并处理的流程(红色框内),以下内容仅供参考. 1.海康SDK接入基本流程 a.初始化并登录验证 NET_DVR_Init(); NET_DVR_DEVICEINFO_V30 struDeviceInfo = { 0 }; long lUserID = NET_DVR_Login_V30(m_cameraIp, m_cameraP

对百度地图SDK中的真机framework和模拟器framework合并时遇到的问题

在终端中输入的命令: lipo -create Release-iphoneos/BaiduMapAPI.framework/BaiduMapAPI Release-iphonesimulator/BaiduMapAPI.framework/BaiduMapAPI -output Release-iphoneos/BaiduMapAPI.framework/BaiduMapAPI 注意: Release-iphoneos/BaiduMapAPI.framework/BaiduMapAPI 为真机

基于深度学习的目标检测

普通的深度学习监督算法主要是用来做分类,如图1(1)所示,分类的目标是要识别出图中所示是一只猫.而在ILSVRC(ImageNet Large Scale Visual Recognition Challenge)竞赛以及实际的应用中,还包括目标定位和目标检测等任务.其中目标定位是不仅仅要识别出来是什么物体(即分类),而且还要预测物体的位置,位置一般用边框(bounding box)标记,如图1(2)所示.而目标检测实质是多目标的定位,即要在图片中定位多个目标物体,包括分类和定位.比如对图1(3

零距离接触阿里云时序时空数据库TSDB

概述最近,Amazon新推出了完全托管的时间序列数据库Timestream,可见,各大厂商对未来时间序列数据库的重视与日俱增.阿里云TSDB是阿里巴巴集团数据库事业部研发的一款高性能分布式时序时空数据库,在即将过去的2018年,我们对TSDB进行了多次的系统架构改进,引入了倒排索引.无限时间线支持.时序数据高压缩比算法.内存缓存.数据预处理.分布式并行聚合.GPU加速等多项核心技术,并且引入了新的计算引擎层和分布式SQL层,使得引擎核心能力有了质的提升,也基本上统一了集团内部的监控存储业务.20

4. 基于深度学习的目标检测算法的综述(转)

4. 基于深度学习的目标检测算法的综述(转) 原文链接:https://www.cnblogs.com/zyly/p/9250195.html 目录 一 相关研究 1.选择性搜索(Selective Search) 2.OverFeat 二.基于区域提名的方法 1.R-CNN 2.SPP-Net 3.Fast R-CNN 4.Faster R-CNN 5.R-FCN 三 端对端的方法 1.YOLO 2.SSD 四 总结 在前面几节中,我们已经介绍了什么是目标检测,以及如何进行目标检测,还提及了滑

【下载】推荐一款免费的人脸识别SDK

现已进入刷脸的时代,例如,人脸支付.人脸识别的门禁.人流监控等等.如何在Firefly开源板上快速搭建DEMO,并快速产品化?为了让更多产品可以用上人脸识别技术,Firefly推出了一款高性能人脸识别SDK.此SDK的人脸识别的算法,运行效率高,识别精确度高,性能优异,可以直接应用于商业产品. 下文主要讲述如何在Firefly RK3399平台部署并测试OpenFace SDK,Let's GO!      一.Firefly RK3399开源板安装Ubuntu 16.04系统固件      系

集成视频编辑SDK流程

一.运行环境 Android 4.1(api 16)以上: 处理器:双核 1GHz以上CPU(目前只支持ARM CPU, X86.MIPS暂不支持):推荐四核1.2GHz以上CPU 内存:1 GB以上: 二.注册申请AppKey和APPSECRET 1. 登录http://www.rdsdk.com 注册用户 2. 登录注册好的用户 3. 进入视频云管理 点击(新增)获取应用的 appkey .appsecret 三.下载并导入SDK 1. Android Studio 导入xpkUISdk 点