opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题

这篇具有很好参考价值的文章主要介绍了opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以下介绍下opencv实现图像去畸变的几种方式以及详细参数说明,含项目案例,含扩展的相关知识

cv::fisheye::initUndistortRectifyMap 和cv::initUndistortRectifyMap 都是 OpenCV 库中的函数,用于摄像机的畸变校正和图像的矫正。二者的区别在于,cv::fisheye::initUndistortRectifyMap 适用于鱼眼相机的畸变校正和图像矫正,而 cv::initUndistortRectifyMap 适用于普通相机的畸变校正和图像矫正。

具体来说,cv::fisheye::initUndistortRectifyMap 函数可以用于鱼眼相机的畸变校正和图像矫正,它的参数包括输入图像的大小、相机内参矩阵、畸变系数、旋转矩阵和投影矩阵等。函数的返回值是两个映射矩阵,可以用于后续的图像矫正操作。

而 cv::initUndistortRectifyMap 函数则可以用于普通相机的畸变校正和图像矫正,它的参数包括输入图像的大小、相机内参矩阵、畸变系数、旋转矩阵和投影矩阵等。函数的返回值同样是两个映射矩阵,可以用于后续的图像矫正操作。

需要注意的是,cv::fisheye::initUndistortRectifyMap 函数适用于鱼眼相机的畸变校正和图像矫正,但是它的运行速度相对较慢,因此在实际应用中需要根据具体情况选择合适的函数。cv::fisheye::initUndistortRectifyMap效果如下图:

去畸变前:

opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题

去畸变后:

opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题

另外,介绍一个效果比较好的扩展库:opencv_contrib。提供 cv::omnidir::initUndistortRectifyMap接口实现去畸变效果,如下图:

去畸变前:

opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题

去畸变后:

opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题

以下则以方案 ③为例更为详细的说明一下:

  • 具体参数(以下示例参数是1920*1080分辨率的)
{
    "distcoeff":{
        "distortMatrix":[
            1.1445103126389398,
            -1.5381069838860892,
            -0.0002758264626124696,
            0.0005343518274311642,
            0
        ]
    },
    "extrinsic":{
        "rotation":{
            "w":-0.4503108282902849,
            "x":0.54120891939059612,
            "y":-0.531561574479537,
            "z":0.47090907406145438
        },
        "translation":{
            "x":4.6313664462542317,
            "y":0.016680599912867258,
            "z":0.85922674428639156
        }
    },
    "intrinsic":{

        // 以下"matrix"(相机内参需要根据分辨率的不同动态变化, 需要重新计算或者对鱼眼相机重新标定)
        "height":1080,
        "matrix":[
            1559.081393096325,
            -0.05575693563188319,
            964.2708291230333,
            0,
            1557.3809973911518,
            519.5834214435208,
            0,
            0,
            1
        ],
        "width":1920
    },
    "name":"H60L-D12310650",
    "topic":"/sensor/camera/sensing/image_raw_fisheye_front",
    "type":"SENSING_195",
    "xi":2.045049153257521
}
  • 以下是两种方式对应的完整c++代码实现(注意:扩展库需要依赖lib库&拷贝dll库)

lib: opencv_world460.lib, opencv_ccalib460.lib这两个

dll:如下这几个依赖库

opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题

下面是两个版本的代码,可以对比着看效果更好:

#include <opencv2/opencv.hpp>
#include <opencv2/core/mat.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/calib3d.hpp>
#include <opencv2/ccalib/omnidir.hpp>

/*********************************************去畸变全局数据开始************************************************************/
/**内参矩阵K
 * fx  0  cx
 * 0  fy  cy
 * 0   0   1
 */
double g_fx = 1541.2289276548197, g_fy = 1541.4827807859522, g_cx = 952.65903854976341, g_cy = 530.2873317817764;

// 畸变参数
double g_k1 = 1.1691361330036689, g_k2 = -1.5203988059068219, g_p1 = 0.001154300156796058, g_p2 = -0.00094038834164979646;

cv::Mat g_map1, g_map2;

const double g_alpha = 1;
const double g_undistor_banlence = 0; // 控制输出图片尺寸, 根据需求调整即可

int g_centerX = 0;
int g_centerY = 0;
/*********************************************去畸变全局数据结束************************************************************/

void OpenGLDisplay::dealDedistort() {
    cv::Mat k = cv::Mat::eye(3, 3, CV_32FC1);   // 内参矩阵
    k.at<float>(0, 0) = g_fx;
    k.at<float>(0, 2) = g_cx;
    k.at<float>(1, 1) = g_fy;
    k.at<float>(1, 2) = g_cy;

    cv::Mat d = cv::Mat::zeros(1, 4, CV_32FC1); // 畸变系数矩阵 顺序是[k1, k2, p1, p2]
    d.at<float>(0, 0) = g_k1;
    d.at<float>(0, 1) = g_k2;
    d.at<float>(0, 2) = g_p1;
    d.at<float>(0, 3) = g_p2;

    cv::Mat xi = cv::Mat::zeros(1, 1, CV_32FC1);
    xi.at<float>(0, 0) = 2.0363457667452303;

    cv::Mat intrisicCvMat720;
    if (impl->mVideoH == VIDEOHEIGHT720) {
        convertCalibration(K, intrisicCvMat720);
        K= intrisicCvMat720;
    }

    cv::Mat newCameraMatrix = getOptimalNewCameraMatrix(K, D, cv::Size(impl->mVideoW, impl->mVideoH), g_alpha, imageSize, 0);
    
    newCameraMatrix = cv::Mat::eye(3, 3, CV_64FC1);

    // 相机焦距, 与世界尺度相关
    newCameraMatrix.at<double>(0, 0) = 300.0;
    newCameraMatrix.at<double>(1, 1) = 300.0;

    GLvoid * mBuffer = nullptr;

    if (impl->mVideoH == VIDEOHEIGHT1080) {
        mBuffer = impl->mBufYuv_1080;
        g_centerX = 0;
        g_centerY = 0;
    }
    else if (impl->mVideoH == VIDEOHEIGHT720) {
        mBuffer = impl->mBufYuv_720;
        g_centerX = 0;
        g_centerY = -17; // 针对输出图像中心点做调整(当进行图像去畸变操作时,会对图像进行扭曲矫正以纠正镜头畸变,但是这可能会导致图像的拉伸和变形。当中心点下移时,可能会影响到图像的视觉效果和后续处理操作), 这个值可能随着相机数据的变化而变。具体可以看上面对比图:很明显处理后的图像往下偏了几十个像素。需要给它调整回去以避免图像上其他元素去畸变后又跟图像有位置偏差问题。
    }
    else  if (impl->mVideoH == VIDEOHEIGHT480) {
        mBuffer = impl->mBufYuv_480;
        g_centerX = 0;
        g_centerY = 0;
    }

    // 主点位置,与图像中心点相关
    newCameraMatrix.at<double>(0, 2) = static_cast<double>(imageSize.width / 2) + static_cast<double>(g_centerX);
    newCameraMatrix.at<double>(1, 2) = static_cast<double>(imageSize.height / 2) + static_cast<double>(g_centerY);
    
    1. 效果不好、不是很明显  
    cv::initUndistortRectifyMap(K, D, cv::Mat(), NewCameraMatrix, imageSize, CV_16SC2, map1, map2);
    2. 效果不是很明显
    cv::fisheye::initUndistortRectifyMap(K, D, cv::Mat(), NewCameraMatrix, imageSize, CV_16SC2, map1, map2);
    3. 效果不错。对应扩展库是opencv_contrib 
    cv::omnidir::initUndistortRectifyMap(K, D, xi, cv::Mat::eye(3, 3, CV_64FC1), newCameraMatrix, imageSize, CV_32FC1, g_map1, g_map2, cv::omnidir::RECTIFY_PERSPECTIVE);

    cv::Mat yuvImg(impl->mVideoH * 3 / 2, impl->mVideoW, 0, mBuffer);

    cv::Mat bgrImg;
    cv::cvtColor(yuvImg, bgrImg, COLOR_YUV2BGR_I420);

    cv::Mat distortImage;
    cv::remap(bgrImg, distortImage, g_map1, g_map2, cv::INTER_LINEAR);
    int evenRows = distortImage.rows / 2 * 2;
    int evenCols = distortImage.cols / 2 * 2;
    cv::Rect select = Rect(0, 0, evenCols, evenRows);
    Mat cropImg = distortImage(select);
    Mat yuvImgNew;
    cv::cvtColor(cropImg, yuvImgNew, COLOR_BGR2YUV_I420);

    if (mBuffer != nullptr) {
        std::memcpy(mBuffer, yuvImgNew.data, static_cast<size_t>(impl->mVideoH * 3 / 2) * static_cast<size_t>(impl->mVideoW));
    }
}
// 第二个版本
void OpenGLDisplay::dealDedistort() {
    Eigen::Matrix3d intrisicMat; // 相机内参 3*3矩阵
    if (m_vehicleCalibrationData.sensing120().intrinsic().matrix().size() < 9) {
        return;
    }

    intrisicMat << m_vehicleCalibrationData.sensing120().intrinsic().matrix().at(0),
                   m_vehicleCalibrationData.sensing120().intrinsic().matrix().at(1),
                   m_vehicleCalibrationData.sensing120().intrinsic().matrix().at(2),
                   m_vehicleCalibrationData.sensing120().intrinsic().matrix().at(3),
                   m_vehicleCalibrationData.sensing120().intrinsic().matrix().at(4),
                   m_vehicleCalibrationData.sensing120().intrinsic().matrix().at(5),
                   m_vehicleCalibrationData.sensing120().intrinsic().matrix().at(6),
                   m_vehicleCalibrationData.sensing120().intrinsic().matrix().at(7),
                   m_vehicleCalibrationData.sensing120().intrinsic().matrix().at(8);

    cv::Mat distCoeffs; // 畸变系数
    if (m_vehicleCalibrationData.sensing120().distcoeff().distort_matrix().size() < 5) {
        return;
    }

    distCoeffs = (Mat_<double>(1, 4) << m_vehicleCalibrationData.sensing120().distcoeff().distort_matrix().at(0),
                                        m_vehicleCalibrationData.sensing120().distcoeff().distort_matrix().at(1),
                                        m_vehicleCalibrationData.sensing120().distcoeff().distort_matrix().at(2),
                                        m_vehicleCalibrationData.sensing120().distcoeff().distort_matrix().at(3));

    cv::Size imageSize(impl->mVideoW, impl->mVideoH);
    imageSize.width = imageSize.width * (1 + g_undistor_banlence);
    imageSize.height = imageSize.height * (1 + g_undistor_banlence);

    cv::Mat intrisicCvMat;
    cv::eigen2cv(intrisicMat, intrisicCvMat);

    double xi = m_vehicleCalibrationData.sensing120().xi();

    cv::Mat intrisicCvMat720;
    if (impl->mVideoH == VIDEOHEIGHT720) {
        convertCalibration(intrisicCvMat, intrisicCvMat720);
        intrisicCvMat = intrisicCvMat720;
    }

    cv::Mat newCameraMatrix = getOptimalNewCameraMatrix(intrisicCvMat, distCoeffs, cv::Size(impl->mVideoW, impl->mVideoH), g_alpha, imageSize, 0);
    
    newCameraMatrix = cv::Mat::eye(3, 3, CV_64FC1);

    // 相机焦距, 与世界尺度相关
    newCameraMatrix.at<double>(0, 0) = 300.0;
    newCameraMatrix.at<double>(1, 1) = 300.0;

    GLvoid * mBuffer = nullptr;

    if (impl->mVideoH == VIDEOHEIGHT1080) {
        mBuffer = impl->mBufYuv_1080;
        g_centerX = 0;
        g_centerY = 0;
    }
    else if (impl->mVideoH == VIDEOHEIGHT720) {
        mBuffer = impl->mBufYuv_720;
        g_centerX = 0;
        g_centerY = -17; // 针对输出图像中心点做调整, 这个值可能随着相机数据的变化而变
    }
    else  if (impl->mVideoH == VIDEOHEIGHT480) {
        mBuffer = impl->mBufYuv_480;
        g_centerX = 0;
        g_centerY = 0;
    }

    // 主点位置,与图像中心点相关
    newCameraMatrix.at<double>(0, 2) = static_cast<double>(imageSize.width / 2) + static_cast<double>(g_centerX);
    newCameraMatrix.at<double>(1, 2) = static_cast<double>(imageSize.height / 2) + static_cast<double>(g_centerY);

    cv::omnidir::initUndistortRectifyMap(intrisicCvMat, distCoeffs, xi, cv::Mat::eye(3, 3, CV_64FC1), newCameraMatrix, imageSize, CV_32FC1, g_map1, g_map2, cv::omnidir::RECTIFY_PERSPECTIVE);

    if (mBuffer == nullptr) return;
    cv::Mat yuvImg(impl->mVideoH * 3 / 2, impl->mVideoW, 0, mBuffer);

    cv::Mat bgrImg;
    cv::cvtColor(yuvImg, bgrImg, COLOR_YUV2BGR_I420);

    cv::Mat distortImage;
    cv::remap(bgrImg, distortImage, g_map1, g_map2, cv::INTER_LINEAR);

    int evenRows = distortImage.rows / 2 * 2;
    int evenCols = distortImage.cols / 2 * 2;
    cv::Rect select = Rect(0, 0, evenCols, evenRows);

    cv::Mat cropImg;
    cropImg = distortImage(select);
    
    cv::Rect rect((cropImg.size().width - impl->mVideoW) / 2, (cropImg.size().height - impl->mVideoH) / 2, impl->mVideoW, impl->mVideoH);
    cropImg = cropImg(rect);

    Mat yuvImgNew;
    cv::cvtColor(cropImg, yuvImgNew, COLOR_BGR2YUV_I420);

    if (mBuffer != nullptr) {
        std::memcpy(mBuffer, yuvImgNew.data, static_cast<size_t>(impl->mVideoH * 3 / 2) * static_cast<size_t>(impl->mVideoW));
    }
}
  • 以下是几个核心工程化可以自行调整的参数&&其变化对应的效果图的展示(方便理解参数原理);另外以下代码片段可以在上面的代码块中找到位置。

        1. const double g_alpha = 1; // 值可以取0/1 参数调整对比效果如下图:

        0 (视场会放大)

opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题

        1 (视场不变)

opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题

         可以看出:alpha=0,视场会放大,alpha=1,视场不变。

        2. const double g_undistor_banlence = 0; // 控制输出图片尺寸, 根据需求调整。参数调整对比效果如下图:

        0(1:1)

opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题

        0.5(1.5倍)

opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题

 具体效果自己细品,跟alpha调整效果有点类似。

        3. int g_centerX = 0; int g_centerY = 0; 

            ...

           // 主点位置,与图像中心点相关
           newCameraMatrix.at<double>(0, 2) = static_cast<double>(imageSize.width / 2) + static_cast<double>(g_centerX);
           newCameraMatrix.at<double>(1, 2) = static_cast<double>(imageSize.height / 2) + static_cast<double>(g_centerY); (0, 0)--》(300, 300)参数调整对比效果如下图:

(0, 0)

opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题

 (300, 300)

opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题

可以明显看到,图像中心点整体往右下移动了。

        4. // 相机焦距, 与世界尺度相关. 控制输出图像是否放大展示, 值越大, 图像越被放大
            newCameraMatrix.at<double>(0, 0) = 100.0;
            newCameraMatrix.at<double>(1, 1) = 100.0; 参数调整(100.0, 100.0)--》(300.0, 300.0)对比效果如下图:

(100.0, 100.0)

opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题

 (300.0, 300.0)

opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题

 可以明显看到,图像明显放大了并且渲染区域相对填满了些。

以下是针对图像上的其他元素:如辅助线、导航线、施工、事件等。涉及点位信息计算去畸变的代码(以达到跟去畸变后图像相对匹配的效果):

cv::Point2f LayoutCtr::getDedistortPoint(const cv::Point &point) {
	std::vector<cv::Point2f> srcPoints = { point };
	cv::Mat srcMat(srcPoints.size(), 1, CV_32FC2);

	for (int i = 0; i < srcPoints.size(); i++) {
		srcMat.at<cv::Vec2f>(i, 0) = cv::Vec2f(srcPoints[i].x, srcPoints[i].y);
	}

	cv::Mat dstMat;
    // 注意: 以计算点位为准, 图像有被处理
 	cv::undistortPoints(srcMat, dstMat, m_intrisicMat, m_distCoeffs);

	// 将归一化的点信息转换为非归一化的点信息
	std::vector<cv::Point2f> unnormalizedPoints;
	for (int i = 0; i < dstMat.rows; i++) {
		cv::Point2f p_n = dstMat.at<cv::Point2f>(i);
		cv::Point2f p(m_intrisicMat.at<double>(0, 0) * p_n.x + m_intrisicMat.at<double>(0, 2),
					  m_intrisicMat.at<double>(1, 1) * p_n.y + m_intrisicMat.at<double>(1, 2));
		unnormalizedPoints.push_back(p);
	}

	return unnormalizedPoints.front();
}

// 调用位置
...
cv::Point2f pt2 = getDedistortPoint(rightLine);
		rightLine.x = static_cast<int>(cvRound(pt2.x));
		rightLine.y = static_cast<int>(cvRound(pt2.y));
...

对比图如下:

opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题

可以看到,经过调整输出图像的中心点后,去畸变前后辅助线头部相对图像的位置基本没有偏移了。

问题

1. 鱼眼相机标定的1080分辨率的辅助线的点位跟720分辨率的辅助线的点位有什么区别?

        鱼眼相机标定的辅助线是用来提供参考的点位,用于在图像中对鱼眼畸变进行校正,以获得更加准确的测量结果。辅助线的点位与图像分辨率有关,因为不同分辨率的图像中包含的像素数量和像素密度不同。

        对于同一鱼眼相机,使用不同分辨率的辅助线,其点位位置会有所不同。具体来说,使用1080分辨率的辅助线时,辅助线上的点位数量更多,而且点位之间的间距更小。这是因为1080分辨率的图像包含更多的像素,因此可以更细致地刻画鱼眼畸变的特征。

        相反,使用720分辨率的辅助线时,辅助线上的点位数量较少,而且点位之间的间距较大。这是因为720分辨率的图像包含较少的像素,不能像1080分辨率那样提供更精细的畸变特征。

        因此,在进行鱼眼相机标定时,应该选择与所使用的图像分辨率相匹配的辅助线,以确保标定结果的准确性。

2. 输出的图像中心点有点下移

        当对鱼眼相机采集的图像进行去畸变操作时,由于鱼眼镜头的特殊形状,图像中心点可能会发生偏移。这是因为鱼眼相机的畸变模型比较特殊,不同于普通相机,无法通过简单的内参矩阵修正。在去畸变时,除了畸变参数,还需要考虑鱼眼相机的畸变模型,以及对称中心和缩放因子等因素的影响。

        如果经过去畸变后输出的图像中心点有一定的偏移,可以通过调整相机内参矩阵中的图像中心点坐标来实现修正。具体来说,可以通过修改相机内参矩阵的第三行第一列和第二列的值来调整图像中心点的位置。例如,如果想将输出图像中心点沿x轴方向向右移动delta_x个像素,沿y轴方向向下移动delta_y个像素,可以将相机内参矩阵的第三行第一列和第二列的值分别增加delta_x和delta_y,这样就可以调整输出图像中心点的位置。

        需要注意的是,修改相机内参矩阵的值需要谨慎,因为这可能会影响畸变矫正的结果。在进行调整之前,建议先进行一些实验来确定合适的参数。此外,还可以尝试调整畸变矫正算法的参数或使用其他的畸变矫正算法,以达到更好的去畸变效果。

3. git发完版打tag的目的是啥

在Git中,打tag是为了给一个特定的提交打上标签,以便在日后可以轻松地找到它。打tag可以用来标记版本发布、重要的里程碑或者任何你认为有必要标记的点。

打tag的目的有以下几个方面:

  1. 标记版本:打tag可以标记代码的版本,方便以后回溯和管理。特别是在软件发布时,打tag可以方便地标记发布版本,方便用户下载和使用。
  2. 方便回溯:打tag可以方便地找到历史上某个特定的提交或版本,尤其是在大型项目中或者团队协作中,方便快捷地找到特定版本十分重要。
  3. 保护代码:打tag可以保护某个特定版本的代码不被误操作或者覆盖,保证代码的安全性和可追溯性。
  4. 标记重要里程碑:打tag可以标记某个特定阶段或者重要里程碑的代码,例如一个大的功能开发完成或者项目的一个重要阶段完成等,方便日后的参考和回溯。

总之,打tag可以让我们更好地管理代码,方便回溯历史版本,保护代码安全,并且可以方便地标记版本发布和重要里程碑,是Git中一个非常有用的功能。文章来源地址https://www.toymoban.com/news/detail-496364.html

到了这里,关于opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv图像畸变矫正:源码学习

    参考资料:相机标定(4) 矫正畸变 undistort()和initUndistortRectifyMap() 背景: opencv提供了直接进行畸变矫正的代码,因在项目中需要使用畸变矫正,因此研究一下opencv中畸变矫正的相关接口与代码,便于学习提升与二次开发。 opencv在文档中对相机标定与畸变矫正的原理做了简单

    2024年02月10日
    浏览(27)
  • Python实现视频加速效果(完整代码)

    Python实现视频加速效果(完整代码) 在日常生活中,我们可能需要对某些视频进行编辑,如加速、慢放等效果。Python作为一种以数据分析和计算为主要应用的脚本语言,拥有处理视频的能力。本文将提供Python实现视频加速效果的完整代码,供大家进行参考。 首先我们需要安装所

    2024年02月14日
    浏览(35)
  • 相机的畸变矫正与opencv代码说明

    图像算法中会经常用到摄像机的畸变校正,有必要总结分析OpenCV中畸变校正方法,其中包括普通针孔相机模型和鱼眼相机模型fisheye两种畸变校正方法。普通相机模型畸变校正函数针对OpenCV中的cv::initUndistortRectifyMap(),鱼眼相机模型畸变校正函数对应OpenCV中的cv::fisheye::initUndi

    2024年02月14日
    浏览(26)
  • Python:实现图片叠加效果,附带完整源代码

    Python:实现图片叠加效果,附带完整源代码 在图像处理中,叠加图片是一种广泛应用且非常实用的技术。通过将两张或多张图片叠加在一起,可以达到更好的视觉效果。本文将介绍如何使用Python实现图片叠加功能,并提供完整的源代码。 首先需要安装所需的Python库——Pill

    2024年02月11日
    浏览(41)
  • 使用python-opencv对双目摄像头进行立体视觉图像矫正,去畸变

            1、一张棋盘图         可以直接从opencv官方github下载,这是一个拥有10*7个格子的棋盘,共有 9*6个角点,每个格子24mm ,本文所使用的就是这一个棋盘。你需要将它打印在A4纸上用于后续使用。(也可以根据官方教程自行设置棋盘大小OpenCV: Create calibration pattern)

    2024年02月10日
    浏览(36)
  • opencv对相机进行畸变矫正,及从矫正后的图像坐标反求原来的对应坐标

    目前有个项目,需要用到热成像相机。但是这个热成像相机它的畸变比较厉害,因此需要用标定板进行标定,从而消除镜头畸变。 同时需要实现用户用鼠标点击校正后的画面后,显示用户点击位置的像素所代表的温度。 另外热成像sdk中还有个功能:选定一个rect,可以返回这

    2024年02月16日
    浏览(30)
  • OpenCV开发笔记(七十七):相机标定(二):通过棋盘标定计算相机内参矩阵矫正畸变摄像头图像

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/136616551 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、

    2024年03月13日
    浏览(33)
  • 原生js实现复选框(全选/全不选/反选)效果【含完整代码】

    1、勾选后,可以获取到所勾选的值组成的数组,并展示到页面; 2、全部勾选,以及取消勾选时,要相应地更新全选框的状态及文字显示; 3、点击反选,将所有选项的选择状态置换,并相应改变全选框的状态; 定义一个数组 checkValues ,存放用户所勾选的内容。 再定义一个

    2023年04月13日
    浏览(31)
  • 使用 OpenCV Python 实现自动图像注释工具的详细步骤--附完整源码

    注释是深度学习项目中最关键的部分。它是模型学习效果的决定因素。然而,这是非常乏味且耗时的。一种解决方案是使用自动图像注释工具,这大大缩短了时间。 本文是pyOpenAnnotate系列的一部分,其中包括以下内容。 1、使用 OpenCV 进行图像注释的路线图。 2、pyOpenAnnotate工

    2024年02月11日
    浏览(27)
  • SVM+opencv实现车牌识别(含完整代码)

    目录 前言 一、思路 二、实现 2.1 预处理 2.1.1 导入所需模块 2.1.2 定义显示函数和高斯滤波灰度处理函数 2.2提取车牌位置 2.2.1原图 2.2.2 图像二值化 2.2.3 从图像中提取对表达和描绘区域形状有意义的图像分量--闭操作 2.2.4 获得轮廓并截取图像  2.2.5 车牌二值化  2.2.6 车牌字符

    2024年02月01日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包