工业相机进行白平衡校正以后,为啥拍出的图像还是失真很严重啊,还有没有其它方法可以进行改进的啊

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工业相机进行白平衡校正以后,为啥拍出的图像还是失真很严重啊,还有没有其它方法可以进行改进的啊相关的知识,希望对你有一定的参考价值。

工业相机失真是有的,因为工业相机的彩色都是通过插值出来,如果想色彩还原性好,可以选择高端的3CCD相机,很严重应该是不会的,白平衡的时候可以调整各个颜色的增益值,还有就是工业环境,最好光源稳定,这样对于检测识别等有利。光线暗的时候可以增加曝光时间或者光圈来调整。

选择合适的相机也是机器视觉系统设计中的重要环节,相机的不仅是直接决定所采到的图像分辨率、图像质量等,同时也与整个系统的运行结果直接相关。
选择一款性价比高的工业相机很重要,而Regem Marr 研祥金码的R-3000系列结构紧凑,部署简单,集成百万像素Sensor和高性能处理芯片,具备超强运算能力,可稳定读取高速移动中的条码。机身小巧,性价比高结构紧凑,方便集成即插即用,快速安装自动调节,轻松设定。有什么不清楚的您随时随地拨打4000-697-797服务热线,均可获得产品介绍、购买咨询、售后处理等人工服务,您反馈的任何问题,都将得到专业贴心的解答。
参考技术A 工业相机失真是有的,因为工业相机的彩色都是通过插值出来,如果想色彩还原性好,可以选择高端的3ccd相机,很严重应该是不会的,白平衡的时候可以调整各个颜色的增益值,还有就是工业环境,最好光源稳定,这样对于检测识别等有利。光线暗的时候可以增加曝光时间或者光圈来调整。 参考技术B 白平衡矫正过程基本没问题,只要注意用白纸的话加+2EV曝光补偿。
至于你说的光线暗的时候棕红,亮的时候橘红,这是曝光的问题。要求高的话,运用曲线来修正红通道,暗部输入增加,亮部输入减少。追问

怎么用线性通道来修正啊?我的QQ:383914848

参考技术C 这个时候就有一个问题了:我们知道墙本身还是白的,但是相机就不知道了。从原理上讲,灰卡的灰色一面也可用于白平衡校正,因为它没有带有其它色彩,追问

我是用白纸进行校正的,光线暗时红色盒子拍出来有点偏向红棕色,而光线强时就有点偏向橘红色了,我该怎么进行改进啊]

参考技术D 什么品牌的工业相机?用在什么环境下?本回答被提问者采纳

鱼眼失真校正

【中文标题】鱼眼失真校正【英文标题】:Fisheye distortion correction 【发布时间】:2016-02-15 13:34:23 【问题描述】:

我在此链接http://www.tannerhelland.com/4743/simple-algorithm-correcting-lens-distortion/ 上看到了一种消除鱼眼镜头失真的算法,我尝试使用 opencv 在 C++ 中实现它。当参数强度接近于零时,输​​出图像与输入图像完全相同,并且我得到较高值的不好结果。如果有人知道可能是什么问题(在我的代码中或更一般地,在算法中),那将非常有帮助。 非常感谢。

#include "opencv2\core\core.hpp"
#include "opencv2\highgui\highgui.hpp"
#include "opencv2\calib3d\calib3d.hpp"
#include <stdio.h>
#include <iostream>
#include <math.h>

using namespace std;
using namespace cv;

int main() 

    cout << " Usage: display_image ImageToLoadAndDisplay" << endl;
    Mat_<Vec3b> eiffel;
    eiffel = imread("C:/Users/Administrator/Downloads/TestFisheye.jpg", CV_LOAD_IMAGE_COLOR);   // Read the file
    if (!eiffel.data)                              // Check for invalid input
    
        cout << "Could not open or find the image" << endl;
        return -1;
    
    cout << "Input image depth: " << eiffel.depth() << endl;

    namedWindow("Display window", WINDOW_AUTOSIZE);// Create a window for display.
    imshow("Display window", eiffel);                   // Show our image inside it.

    //waitKey(0);                                          // Wait for a keystroke in the window

    int halfWidth = eiffel.rows / 2;
    int halfHeight = eiffel.cols / 2;
    double strength = 0.0001;
    double correctionRadius = sqrt(pow(eiffel.rows, 2) + pow(eiffel.cols, 2)) / strength;
    Mat_<Vec3b> dstImage = eiffel;

    int newX, newY;
    double distance; 
    double theta; 
    int sourceX; 
    int sourceY; 
    double r;
    for (int i = 0; i < dstImage.rows; ++i)
    
        for (int j = 0; j < dstImage.cols; j++)
        
            newX = i - halfWidth; 
            newY = j - halfHeight;
            distance = sqrt(pow(newX, 2) + pow(newY, 2));
            r = distance / correctionRadius;
            if (r == 0.0)
                theta = 1;
            else
                theta = atan(r) / r;

            sourceX = round(halfWidth + theta*newX);
            sourceY = round(halfHeight + theta * newY);

            dstImage(i, j)[0] = eiffel(sourceX, sourceY)[0];
            dstImage(i, j)[1] = eiffel(sourceX, sourceY)[1];
            dstImage(i, j)[2] = eiffel(sourceX, sourceY)[2];
        
    

    namedWindow("Display window 2", WINDOW_AUTOSIZE);
    imshow("Display window 2", dstImage);                   // Show our image inside it.
    waitKey(0);

    return 0;

PS:我目前正在处理链接中发布的第一张图片。

【问题讨论】:

This 你可能也感兴趣 在此处查看相同算法的 OpenCV 实现 sourcecodezoneseven.blogspot.com/2019/07/… 【参考方案1】:

这里有 2 个问题:

1 - 您需要将强度从 0.0001 增加到更合理的值(尝试 5)。

2 - 您正在使用相同的起点和终点矩阵。这个Mat_&lt;Vec3b&gt; dstImage = eiffel; 实际上并没有分配任何新内存。 dstImage 只是一个指向原始图像的智能指针。因此,当您修改它时,您正在同时修改源图像。这会给你带来非常糟糕的结果。而是做Mat_&lt;Vec3b&gt; dstImage = eiffel.clone()

通过这些更改,我得到以下图像:

不是很好,但至少快速简单。

【讨论】:

在此处查看相同算法的 OpenCV 实现 sourcecodezoneseven.blogspot.com/2019/07/…

以上是关于工业相机进行白平衡校正以后,为啥拍出的图像还是失真很严重啊,还有没有其它方法可以进行改进的啊的主要内容,如果未能解决你的问题,请参考以下文章

白平衡调整的步骤

请问怎么设置白平衡

线阵相机的原理和线阵相机为啥做黑白平衡

rectifyStereoImages(图像校正)输出看起来失真

为啥工业相机进行数据图像处理的时候常常要进行灰度化和二值化

在 OpenCV (Python) 中使用校正失真裁剪图像