自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 read_sdblkfile

读取mtk的sdblk文件,就是补偿的gain 文件,每行gr[1][1]代表第一个block的第一个数据,每行gr[1][2]代表第一个block的第二个数据,每行gr[2][1]代表第二个block的第一个数据,

2024-01-05 17:13:44 335

原创 ob_stable_auto_test---图表显示

纵坐标从180到240,分成30份按(180,182,184,186,188…240),横坐标为data_gr、data_gb,data_r,data_b的数组顺序,比如横坐标为iso100,纵坐标显示的是data_gr[1],iso200显示的是data_gr[2]…ison*100,纵坐标显示的是data_gr[n]我们可以先用以下代码进行测试图表的作用(我所用的raw图是12bit的,所以ob在200左右,我就把图表范围设到180-240)int margin = 50;// 图像大小和曲线颜色。

2023-12-25 20:10:53 361

原创 ob_stable_auto_test--get_ob pre frame

/可以通过更改文件名字来实现批量写入,如std::string filename = “frame” + std::to_string(i) + “.jpg”;4, 创建一个ROI(Region of Interest,感兴趣区域)来表示中间块。2,分别设置四个map,存储gr,gb,b,r。5,得到每个channel的roi均值。每一帧每一个通道ob值的获取。

2023-12-25 19:53:25 322

原创 auto_test_ob_stable--ob值的获取

就是我们想要得到的每帧的 ob值,到时候把每帧的ob得到的ob加在一起再除以帧数,我们就可以得到一个相对稳定的ob值。下一篇我写出每一帧ob值的获取函数get_ob(bayer_order,path_raw)在我们进入正题之前需要先设几个结构体来保存每帧的ob值和每个iso段的ob值。然后我们需要将packed_word转换成raw。

2023-12-25 19:46:58 412

原创 自动化拍照流程-auto_test_ob_stable

以下是一个主题的流程,主要根据bat的执行顺序来的,每次循环也调用了manual ae函数,实现了每个ISO循环一次,接我上一篇的文档。这个是每个ISO最终得到的各个channel的 ob值(我在.bat每个iso 里取了10 frame)wait_for_device();为等待camera 开启的函数。下一篇我们介绍如何得到ob值。

2023-12-25 17:59:31 363

原创 自动化拍照流程-manual_ae.bat change

isp gain 不需要改变(4096为base);3,需要每次拍照把名字改了—类似于 ispgain_sensorgain_shutter.packword -》4096_1024_10000.packword。2,需要把每循环一次需要改变一下 isp gain -------知识点是manual_ae.bat里命令的读取和改变(替换)6,测试各个iso段ob的值,并且保存到txt文件(然后将txt文件导入到excel,用excel的作图功能看出是否稳定)1,首先需要把每个.bat的顺序排出来。

2023-12-14 11:32:47 459

原创 pack_ward与raw的相互转化

虽然排列方式是这个F6 41 实际的16进制为 0X41 F6 ,F6为低八位,41为高八位(“4为高八位中的高四位”),for循环中当i=0时的val1 =0x01f6,val2=0x0314。最近学习pack_ward与raw的相互转化,主要的是要知道pack ward储存方式。比如pack里的储存方式为F6 41 31 我们会转成F6 01 14 03。将12bit raw压缩成16bit的pack raw。

2023-11-24 17:05:10 616 3

原创 图像处理jpg2vedio

我使用 cv::VideoWriter::fourcc 函数指定了一个 ‘MJPG’ 编码器,帧率为30帧/秒,帧大小为640x480像素。3.关闭 cv::VideoWriter 对象:当你完成视频写入后,你应该使用 cv::VideoWriter::release 函数关闭 cv::VideoWriter 对象。2.写入图像帧:你可以使用 cv::VideoWriter::write 函数将 cv::Mat 对象(即图像帧)写入视频文件。

2023-11-08 17:48:25 34

原创 isp图像处理 hdr-oe

按照这边的算法移动区域用se,应该是因为se的shutter小所以用se,取前后两帧的信息,看是否相同区域pixel的value_diff会差很多,差的多则用se,具体实现和论证还需要测试。// 创建一个空的12位图像。这篇文章只是讲述了过曝区域用(se*hdr_ratio)/curve_value,还没有讲述移动区域该怎么办。{ // 读取长曝光和短曝光的图像。

2023-11-06 17:19:45 80

原创 图像处理-坏点补偿

整体的思想是拍摄10张灰卡,或者纯色的,不过必须光滑,没有多余的坑洼,这样得到较准确的坐标就是坏点的信息。到时得到坐标信息时,补偿的时候有可能在边界,到时候需要加一个判断条件,看是使用坏点的哪个方向的3/5个piexl进行平均。这里用均值的kernel就好了。在这个示例中,我首先设定了图像的宽度、高度和数量。然后,我遍历每一张图像,生成文件名,打开文件,读取raw图像,然后对每个坏点进行补偿。具体来说,我计算了坏点周围像素的平均值,然后使用这个平均值来替换坏点的值。

2023-11-03 17:38:08 71

原创 图像处理--坏点识别

在这个示例中,我首先设定了图像的宽度、高度和数量,以及坏点的阈值。然后,我遍历每一张图像,生成文件名,打开文件,读取raw图像,检查每个像素是否是坏点,如果是,则在 badPixelFrequency map中增加该坐标的频率。最后,我遍历 badPixelFrequency map,如果某个坐标的频率大于5,则记录该坐标。如何根据raw图的命名可以依次导入,识别raw图的坏点并且记录坐标,如果每个坐标出现的频率大于5次,则最终记录出这个坐标。

2023-11-03 17:32:13 118

原创 isp 图像处理hdr se&&ne叠图

这个只是一个简单的例子,还需要考虑前一帧和当前帧是否有位移,还需要se是否需要乘上hdr ratio(noise也会bust起来) 达到与ne的亮度保持一致(如果手晃动的话不至于一半暗一般亮),可以将se转成20bit的,再压缩成12bit的,

2023-11-02 17:58:54 53

原创 图像处理图像畸变校正

这个函数通常用于相机标定,因为它可以提供一组已知的3D实际点和对应的2D图像点。在相机标定和畸变矫正中,3D实际点通常来自于一个已知的标定对象,如棋盘格或圆形网格。这些标定对象在世界坐标系中的位置是已知的,因此可以直接得到3D实际点。例如,如果你使用一个棋盘格作为标定板,你可以假设棋盘格在一个平面上(例如,Z=0),并且你知道每个格子的大小,那么你就可以计算出每个格子交点的3D坐标。在这个例子中,我创建了3D实际点,假设棋盘格的大小是1x1,并且棋盘格在Z=0的平面上。imageSize:图像的大小。

2023-11-01 17:18:20 400 1

原创 raw转jpg和,.,::和->的用法含义

* :: **运算符是范围解析运算符,用于访问类或命名空间的静态成员,或者在类的外部定义成员函数。例如,你可以使用std::cout来访问std命名空间中的cout对象,或者使用cv::imwrite来访问cv命名空间中的imwrite函数。将RAW格式的图像转换为JPG格式,你可以使用OpenCV库,但是需要注意的是OpenCV本身并不支持RAW格式的图像。在这个例子中,我首先创建了一个cv::Mat对象和一个指向cv::Mat对象的指针。枚举是一种数据类型,它定义了一个值的有限集合。

2023-11-01 11:27:04 92 1

原创 图像uchar,ushot,uint使用情景

然后,我使用cv::Mat::type函数获取了图像的类型,并使用CV_MAT_DEPTH宏和CV_MAT_CN宏获取了图像的深度和通道数。如果你使用uint作为模板参数,那么你可能会得到错误的结果,除非你的矩阵实际上是一个32位无符号整数类型的矩阵(即CV_32S类型)。如果你的矩阵是一个16位无符号整数类型的矩阵(即CV_16U类型),那么你应该使用ushort作为模板参数。如果你的矩阵是一个8位无符号整数类型的矩阵(即CV_8U类型),那么你应该使用uchar作为模板参数。

2023-11-01 10:02:08 390 1

原创 图像处理原始数据压缩成jpg的步骤,bit位的转换

8位图像每个像素可以表示256(即2的8次方)个不同的颜色或灰度级别,而12位图像每个像素可以表示4096(即2的12次方)个不同的颜色或灰度级别。**将8位图像转换为12位图像,**实际上是将像素值的范围从[0, 255]扩展到[0, 4095]。**JPEG(Joint Photographic Experts Group)**是一种常用的图像文件格式,它使用了一种名为离散余弦变换(Discrete Cosine Transform,DCT)的技术来压缩图像数据。分块:将图像分割为8x8的块。

2023-11-01 09:56:25 68 1

原创 ABL去紫边分析和过程

【代码】ABL去紫边分析和过程。

2023-10-31 16:31:05 48 1

原创 图像处理 ABL去紫边分析和过程

用双边滤波只是初始的第一步,我这边的想法是,找到高饱和区域,并框出个范围,并把紫色进行颜色补偿回去(这个应该是一个渐变的补偿,最好是通过二值化的图像进行颜色程度的叠加或者削弱)。虽然紫色边缘会减弱但是,有一些黑白细节会出现绿色,所以是使用全通道双边滤波还是个别通道双边滤波还需要斟酌。

2023-10-30 14:14:55 71 1

原创 isp图像分割

目的,找到高对比块,对高对比块进行abf(去紫边)操作,这样不会让非高对比块进行计算,减少运算时间。

2023-10-27 17:37:34 38 1

原创 isp_ABF

因此,如果你不需要修改原图像,或者只需要修改原图像的一部分,你可能需要考虑使用其他方法,例如cv::Mat::operator()(const cv::Rect& roi)函数。cv::Mat::clone()函数是OpenCV库中的一个函数,用于创建一个新的cv::Mat对象,这个对象是原图像的一个深拷贝。这意味着新的cv::Mat对象将有自己的数据,对它的任何修改都不会影响原图像。然后,我使用cv::Mat::clone()函数创建了一个新的cv::Mat对象,这个对象是原图像的一个深拷贝。

2023-10-27 17:34:05 61 1

原创 isp图像处理带通滤波器

在你的代码中,lowpass_kernel是一个二维的高斯滤波器kernel,而highpass_kernel是一个3x3的拉普拉斯滤波器kernel。如果像素值大于(或小于)一个给定的阈值,那么这个像素将被设置为一个值(通常是最大值,例如255);在这个例子中,我首先创建了一个二维低通滤波器kernel,然后创建了一个与低通滤波器kernel大小相同的二维高通滤波器kernel。然后,我设置了一个阈值,并使用cv::threshold()函数将细节图像转换为二值图像。以下是一个修改后的例子。

2023-10-26 18:38:09 28

原创 isp带通滤波器

在你的代码中,lowpass_kernel是一个二维的高斯滤波器kernel,而highpass_kernel是一个3x3的拉普拉斯滤波器kernel。如果这两个kernel的大小不同,你需要将它们调整到相同的大小才能进行运算。在这个例子中,我首先创建了一个二维低通滤波器kernel,然后创建了一个与低通滤波器kernel大小相同的二维高通滤波器kernel。这个错误可能是由于lowpass_kernel和highpass_kernel的大小或数据类型不匹配导致的。以下是一个修改后的例子。

2023-10-26 18:36:44 31

原创 isp 使用带通滤波器进行细节检测

通过将低通滤波器和高通滤波器结合起来,带通滤波器可以保留一个特定的频率带,即低于低通滤波器截止频率和高于高通滤波器截止频率的部分。然后,我创建了一个一维高斯滤波器kernel,并使用cv::sepFilter2D()函数将这个kernel分别应用到图像的水平和垂直方向,得到滤波后的图像。,你可以通过调整滤波器的低频截止和高频截止来改变细节检测的强度。要将这个一维高斯滤波器应用到图像上,你可以使用cv::sepFilter2D()函数,它可以将一维滤波器分别应用到图像的水平和垂直方向。

2023-10-26 17:17:29 38

原创 isp hdr fus

具体来说,你可以使用Exposure Fusion技术,它可以将多个不同曝光的图像融合成一个图像,从而在一个图像中捕获场景的宽动态范围。在这个例子中,我首先读取了两个不同曝光的图像,然后将它们放入一个数组中。然后,我创建了一个Exposure Fusion对象,并使用它来进行Exposure Fusion。请注意,你需要将short_exposure.jpg和long_exposure.jpg替换为你的图像文件的实际路径。此外,你可能需要根据你的需求和条件来调整Exposure Fusion的参数。

2023-10-26 16:22:56 37

原创 c++中string&,string,string*的差异

在这个例子中,modifyString函数接受一个std::string参数,当我们将message传递给这个函数时,message被复制,并且函数内部的修改不会影响到原始的message。而modifyStringRef函数接受一个std::string&参数,当我们将message传递给这个函数时,函数实际上接收的是message的引用,因此函数内部的修改会直接影响到原始的message。如果你不想在函数内部修改原始字符串,你应该使用std::string。

2023-10-26 10:30:14 469

原创 isp图像处理(4)tone

cv::LUT函数在OpenCV中用于应用查找表(Look-Up Table,LUT)到图像。查找表是一个映射,它将输入像素值映射到输出像素值。cv::LUT函数接受一个输入图像和一个查找表,然后返回一个新的图像,新图像的像素值是通过查找表从输入图像的像素值得到的。这里是以像素最大为8bit为例子,当小于128则除以2,大于128则乘以2,到时候大家可以多写几个判断条件,以达到curve的形式。

2023-10-25 16:56:06 48 1

原创 isp图像处理(3.1) ccm插值的得出与图像经过ccm变换

在这个例子中,我们首先创建了三个CCM矩阵,然后定义了两个插值参数alpha和beta。然后,我们使用线性插值公式来计算插值后的CCM矩阵。最后,我们将插值后的CCM矩阵打印出来。请注意,你需要将ccmMatrix1、ccmMatrix2和ccmMatrix3中的数据替换为你的实际数据。此外,你可以根据你的需求来调整插值参数alpha和beta。(三个矩阵进行线性插值可以根据target距离的远近来分配权重)

2023-10-25 11:34:43 205 1

原创 isp(3)_ccm,如何产生ccm矩阵

在OpenCV中,你可以使用cv::ccm::ColorCorrectionModel类来创建一个颜色校正模型。你需要将你的输入数据(即你从ColorChecker获取的RGB值)和对应的参考数据(即ColorChecker的标准RGB值)作为参数传递给这个类的构造函数。

2023-10-25 11:25:43 200

原创 isp处理流程(2)bayer partten demosic后piexl中 r,g,b保存到txt文件中

像素r,g,b值保存到txt文件

2023-10-24 15:43:36 47

原创 isp处理的流程(1)-将bayerpartten raw 通过demosic转成rgb 三通道的图像

payer pattern raw

2023-10-24 15:12:05 159

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除