扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

camera|16.一种修改摄像头分辨率的方法

2025/12/09
426
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

调试camera修改分辨率是无法绕开的一个知识点,本文以oc13850为例,讲解如何修改摄像头的分辨率。

soc:rk3568
sdk版本:rk_android11.0_sdk

1. 查看datasheet

ov13850支持3种分辨率:

4224 x 3136
2112x1568
4224x2376

这几种分辨率要如何设置寄存器, datasheet并没有说明。

2. 查看驱动

linux内核自带的驱动,有厂家优化好的2种分辨率寄存器配置信息。

驱动文件:

driversmediai2cov13850.c

支持的分辨率:

数组supported_modes中列举了所有支持的分辨率:

653 static const struct ov13850_mode supported_modes[] = {
 654     {
 655         .width = 2112,
 656         .height = 1568,
 657         .max_fps = {
 658             .numerator = 10000,
 659             .denominator = 300000,
 660         },
 661         .exp_def = 0x0600,
 662         .hts_def = 0x12c0,
 663         .vts_def = 0x0680,
 664         .reg_list = ov13850_2112x1568_regs,
 665     }
 666 
 667 ,{
 668         .width = 4224,
 669         .height = 3136,
 670         .max_fps = {
 671             .numerator = 20000,
 672             .denominator = 150000,
 673         },
 674         .exp_def = 0x0600,
 675         .hts_def = 0x12c0,
 676         .vts_def = 0x0d00,
 677         .reg_list = ov13850_4224x3136_regs,
 678     },
 679 };                                 

在驱动的回调函数ov13850_pad_ops-enum_frame_size ,会根据fse->index显示指定的分辨率

875 static int ov13850_enum_frame_sizes(struct v4l2_subdev *sd,
 876                     struct v4l2_subdev_pad_config *cfg,
 877                    struct v4l2_subdev_frame_size_enum *fse)
 878 {
 879     if (fse->index >= ARRAY_SIZE(supported_modes))                                                                                                                        
 880         return -EINVAL;
 881 
 882     if (fse->code != MEDIA_BUS_FMT_SBGGR10_1X10)
 883         return -EINVAL;
 884 
 885     fse->min_width  = supported_modes[fse->index].width;
 886     fse->max_width  = supported_modes[fse->index].width;
 887     fse->max_height = supported_modes[fse->index].height;
 888     fse->min_height = supported_modes[fse->index].height;
 889 
 890     return 0;
 891 }


1310 static const struct v4l2_subdev_pad_ops ov13850_pad_ops = {
1311     .enum_mbus_code = ov13850_enum_mbus_code,
1312     .enum_frame_size = ov13850_enum_frame_sizes,                                                                                                                          
1313     .enum_frame_interval = ov13850_enum_frame_interval,
1314     .get_fmt = ov13850_get_fmt,
1315     .set_fmt = ov13850_set_fmt,
1316 };

但是我们实际用sdk自带的app打开摄像头时,分辨率始终是4224 x 3136

如果想将默认分辨率设置为2112*1568

可以简单粗暴点,把不用的分辨率注释掉

3. 修改xml

除了修改驱动,我们还要修改安卓部分的配置文件, sdk中该xml文件并不支持2112x1568分辨率

所以需要添加对应的分辨率配置:

hardware/rockchip/camera/etc/camera/camera3_profiles_rk356x.xml
diff --git a/etc/camera/camera3_profiles.xml b/etc/camera/camera3_profiles.xml
index c716305..b3ad66b 100644
--- a/etc/camera/camera3_profiles.xml
+++ b/etc/camera/camera3_profiles.xml
@@ -40,7 +40,7 @@
             <control.availableVideoStabilizationModes value="OFF"/>
             <control.maxRegions value="1,0,1"/>
             <!-- JPEG -->
-            <jpeg.maxSize value="11985408"/>  <!-- 3264*2448*1.5 -->
+            <jpeg.maxSize value="4967424"/>  <!-- 3264*2448*1.5=11985408  2112x1568*1.5= 4967424-->
             <jpeg.availableThumbnailSizes value="0,0,160,120,320,180,320,240"/> <!-- INCREASING ORDER -->
             <!-- Lens Info-->
             <!-- TODO: availableApertures now is fake for we do not get the real apertures -->
@@ -151,6 +151,7 @@
             <scaler.availableInputOutputFormatsMap value="IMPLEMENTATION_DEFINED,2,YCbCr_420_888,BLOB,YCbCr_420_888,2,YCbCr_420_888,BLOB"/>
             <scaler.availableStreamConfigurations value="BLOB,3264x2448,OUTPUT,
                 BLOB,2592x1944,OUTPUT,
+                BLOB,2112x1568,OUTPUT,
                 BLOB,1920x1080,OUTPUT,
                 BLOB,1280x960,OUTPUT,
                 BLOB,1280x720,OUTPUT,
@@ -160,6 +161,7 @@
                 YCbCr_420_888,3264x2448,OUTPUT,
                 YCbCr_420_888,2592x1944,OUTPUT,
                 YCbCr_420_888,1920x1080,OUTPUT,
+                YCbCr_420_888,2112x1568,OUTPUT,
                 YCbCr_420_888,1280x960,OUTPUT,
                 YCbCr_420_888,1280x720,OUTPUT,
                 YCbCr_420_888,640x480,OUTPUT,
@@ -167,6 +169,7 @@
                 YCbCr_420_888,176x144,OUTPUT,
                 IMPLEMENTATION_DEFINED,3264x2448,OUTPUT,
                 IMPLEMENTATION_DEFINED,2592x1944,OUTPUT,
+                IMPLEMENTATION_DEFINED,2112x1568,OUTPUT,
                 IMPLEMENTATION_DEFINED,1920x1080,OUTPUT,
                 IMPLEMENTATION_DEFINED,1280x960,OUTPUT,
                 IMPLEMENTATION_DEFINED,1280x720,OUTPUT,
@@ -175,6 +178,7 @@
                 IMPLEMENTATION_DEFINED,176x144,OUTPUT"/>
             <scaler.availableMinFrameDurations value="BLOB,3264x2448,33333333,
                 BLOB,2592x1944,33333333,
+                BLOB,2112x1568,33333333,
                 BLOB,1920x1080,33333333,
                 BLOB,1280x960,33333333,
                 BLOB,1280x720,33333333,
@@ -183,6 +187,7 @@
                 BLOB,176x144,33333333,
                 YCbCr_420_888,3264x2448,33333333,
                 YCbCr_420_888,2592x1944,33333333,
+                YCbCr_420_888,2112x1568,33333333,
                 YCbCr_420_888,1920x1080,33333333,
                 YCbCr_420_888,1280x960,33333333,
                 YCbCr_420_888,1280x720,33333333,
@@ -191,6 +196,7 @@
                 YCbCr_420_888,176x144,33333333,
                 IMPLEMENTATION_DEFINED,3264x2448,33333333,
                 IMPLEMENTATION_DEFINED,2592x1944,33333333,
+                IMPLEMENTATION_DEFINED,2112x1568,33333333,
                 IMPLEMENTATION_DEFINED,1920x1080,33333333,
                 IMPLEMENTATION_DEFINED,1280x960,33333333,
                 IMPLEMENTATION_DEFINED,1280x720,33333333,
@@ -199,6 +205,7 @@
                 IMPLEMENTATION_DEFINED,176x144,33333333" />
             <scaler.availableStallDurations value="BLOB,3264x2448,33333333,
                                                    BLOB,2592x1944,33333333,
+                                                   BLOB,2112x1568,33333333,
                                                    BLOB,1920x1080,33333333,
                                                    BLOB,1280x960,33333333,
                                                    BLOB,1280x720,33333333,
@@ -207,13 +214,13 @@
                                                    BLOB,176x144,33333333" />
             <scaler.croppingType value="CENTER_ONLY"/>
             <!-- Sensor Info -->
-            <sensor.info.activeArraySize value="0,0,3264,2448"/>
+            <sensor.info.activeArraySize value="0,0,2112,1568"/>
             <sensor.info.sensitivityRange value="32,2400"/>
             <sensor.info.colorFilterArrangement value="BGGR"/> <!-- HAL may override this value from CMC for RAW sensors -->
             <sensor.info.exposureTimeRange value="100000,333333330"/>
             <sensor.info.maxFrameDuration value="66666666"/>
             <sensor.info.physicalSize value="5.5,4.5"/> <!-- 4224x1.12um 3136x1.12um -->
-            <sensor.info.pixelArraySize value="3264x2448"/>
+            <sensor.info.pixelArraySize value="2112x1568"/>
             <sensor.info.whiteLevel value="0"/> <!-- HAL may override this value from CMC for RAW sensors -->
             <sensor.info.timestampSource value="UNKNOWN"/>
             <!-- Sensor -->
@@ -255,7 +262,7 @@
         <Hal_tuning_RKISP1> <!-- Parameters to tune the HAL and hacks for the HAL that are camera dependent -->
             <flipping value="" value_v=""/> <!-- value: SENSOR_FLIP_H or "", value_v: SENSOR_FLIP_V or "" -->
             <supportIsoMap value="false"/>
-            <supportTuningSize value="3264x2448"/>
+            <supportTuningSize value="2112x1568"/>
         </Hal_tuning_RKISP1>
 
         <Sensor_info_RKISP1> <!-- Information that parametrizes the behavior or qualities of the physical sensor -->
diff --git a/etc/camera/camera3_profiles_rk356x.xml b/etc/camera/camera3_profiles_rk356x.xml
index cddeba3..972994a 100644
--- a/etc/camera/camera3_profiles_rk356x.xml
+++ b/etc/camera/camera3_profiles_rk356x.xml
@@ -40,7 +40,7 @@
             <control.availableVideoStabilizationModes value="OFF"/>
             <control.maxRegions value="1,0,1"/>
             <!-- JPEG -->
-            <jpeg.maxSize value="11985408"/>  <!-- 3264*2448*1.5 -->
+            <jpeg.maxSize value="4967424"/>  <!-- 3264*2448*1.5=11985408  2112x1568*1.5 = 4,967,424 -->
             <jpeg.availableThumbnailSizes value="0,0,160,120,320,180,320,240"/> <!-- INCREASING ORDER -->
             <!-- Lens Info-->
             <!-- TODO: availableApertures now is fake for we do not get the real apertures -->
@@ -149,7 +149,7 @@
             <!-- Scaler -->
             <scaler.availableMaxDigitalZoom value="4.0"/>
             <scaler.availableInputOutputFormatsMap value="IMPLEMENTATION_DEFINED,2,YCbCr_420_888,BLOB,YCbCr_420_888,2,YCbCr_420_888,BLOB"/>
-            <scaler.availableStreamConfigurations value="BLOB,3264x2448,OUTPUT,
+            <scaler.availableStreamConfigurations value="BLOB,2112x1568,OUTPUT,
                 BLOB,2592x1944,OUTPUT,
                 BLOB,1920x1080,OUTPUT,
                 BLOB,1280x960,OUTPUT,
@@ -173,7 +173,7 @@
                 IMPLEMENTATION_DEFINED,640x480,OUTPUT,
                 IMPLEMENTATION_DEFINED,320x240,OUTPUT,
                 IMPLEMENTATION_DEFINED,176x144,OUTPUT"/>
-            <scaler.availableMinFrameDurations value="BLOB,3264x2448,33333333,
+            <scaler.availableMinFrameDurations value="BLOB,2112x1568,33333333,
                 BLOB,2592x1944,33333333,
                 BLOB,1920x1080,33333333,
                 BLOB,1280x960,33333333,
@@ -197,7 +197,7 @@
                 IMPLEMENTATION_DEFINED,640x480,33333333,
                 IMPLEMENTATION_DEFINED,320x240,33333333,
                 IMPLEMENTATION_DEFINED,176x144,33333333" />
-            <scaler.availableStallDurations value="BLOB,3264x2448,33333333,
+            <scaler.availableStallDurations value="BLOB,2112x1568,33333333,
                                                    BLOB,2592x1944,33333333,
                                                    BLOB,1920x1080,33333333,
                                                    BLOB,1280x960,33333333,
@@ -207,13 +207,13 @@
                                                    BLOB,176x144,33333333" />
             <scaler.croppingType value="CENTER_ONLY"/>
             <!-- Sensor Info -->
-            <sensor.info.activeArraySize value="0,0,3264,2448"/>
+            <sensor.info.activeArraySize value="0,0,2112,1568"/>
             <sensor.info.sensitivityRange value="32,2400"/>
             <sensor.info.colorFilterArrangement value="BGGR"/> <!-- HAL may override this value from CMC for RAW sensors -->
             <sensor.info.exposureTimeRange value="100000,333333330"/>
             <sensor.info.maxFrameDuration value="66666666"/>
             <sensor.info.physicalSize value="5.5,4.5"/> <!-- 4224x1.12um 3136x1.12um -->
-            <sensor.info.pixelArraySize value="3264x2448"/>
+            <sensor.info.pixelArraySize value="2112x1568"/>
             <sensor.info.whiteLevel value="0"/> <!-- HAL may override this value from CMC for RAW sensors -->
             <sensor.info.timestampSource value="UNKNOWN"/>
             <!-- Sensor -->
@@ -255,7 +255,7 @@
         <Hal_tuning_RKISP1> <!-- Parameters to tune the HAL and hacks for the HAL that are camera dependent -->
             <flipping value="" value_v=""/> <!-- value: SENSOR_FLIP_H or "", value_v: SENSOR_FLIP_V or "" -->
             <supportIsoMap value="false"/>
-            <supportTuningSize value="3264x2448"/>
+            <supportTuningSize value="2112x1568"/>
         </Hal_tuning_RKISP1>
 
         <Sensor_info_RKISP1> <!-- Information that parametrizes the behavior or qualities of the physical sensor -->

4. 查看

编译重新启动,通过命令**media-ctl **查看信息

# media-ctl -d /dev/media0 -p

……
- entity 74: m00_b_ov13850 4-0010 (1 pad, 1 link)
             type V4L2 subdev subtype Sensor
             device node name /dev/v4l-subdev4
        pad0: Source
                [fmt:SBGGR10/2112x1568]
                -> "rockchip-csi2-dphy0":0 []

可以看到分辨率修改了。

好了,更多瑞芯微相关资料,请公众号【一口Linux 】转发回复:rxw

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

公众号『一口Linux』号主彭老师,拥有15年嵌入式开发经验和培训经验。曾任职ZTE,某研究所,华清远见教学总监。拥有多篇网络协议相关专利和软件著作。精通计算机网络、Linux系统编程、ARM、Linux驱动、龙芯、物联网。原创内容基本从实际项目出发,保持原理+实践风格,适合Linux驱动新手入门和技术进阶。