C++ OpenCV实现灰度世界白平衡时LAB通道更新与hstack等效实现问题
问题1:更新LAB格式Mat对象的通道数值
你当前的代码有两处核心问题:一是赋值位置错误(放在了内层循环外,只能拿到最后一个像素的计算值),二是res.at<Mat>(1)的写法不符合OpenCV的像素访问规则,无法读取/修改单通道像素值。
正确实现方式(推荐用更安全的at方法访问像素,避免指针偏移出错)
cap >> frame; cv::cvtColor(frame, res, cv::COLOR_BGR2Lab); // 遍历每个像素 for(int i = 0; i < res.rows; i++){ for(int j = 0; j < res.cols; j++){ // 直接读取当前像素的Lab三通道值,Vec3b对应8位3通道像素的存储结构 cv::Vec3b lab_pixel = res.at<cv::Vec3b>(i,j); // 计算L通道的归一化值(8位存储下L范围0-255对应实际0-100) float L = lab_pixel[0] * 100.0 / 255.0; // 计算调整后的a通道值 float new_a = lab_pixel[1] - ((lab_pixel[1] - 128) * (L / 100) * 1.1); // 计算调整后的b通道值 float new_b = lab_pixel[2] - ((lab_pixel[2] - 128) * (L / 100) * 1.1); // 数值截断避免超出0-255的uchar范围,避免溢出异常 new_a = cv::saturate_cast<uchar>(new_a); new_b = cv::saturate_cast<uchar>(new_b); // 回写更新到res中 res.at<cv::Vec3b>(i,j)[1] = new_a; res.at<cv::Vec3b>(i,j)[2] = new_b; // 如果不需要修改L通道可以不用赋值 } } cv::cvtColor(res, res, cv::COLOR_Lab2BGR);
如果你坚持用指针操作,只需要把计算后的new_a、new_b赋值给res.data[res.step*i + res.channels()*j + 1]和对应b通道的位置即可,注意必须用res自身的step属性,不能用frame的step。
问题2:实现Python中np.hstack的水平拼接功能
OpenCV提供了原生的水平拼接函数cv::hconcat,只要待拼接的两张图高度、通道数、位深完全一致,就可以直接调用:
cv::Mat final_img; // 第一个参数是原帧,第二个是白平衡处理后的帧,第三个是输出的拼接结果 cv::hconcat(frame, res, final_img);
如果需要垂直拼接可以用cv::vconcat接口,用法完全一致。
内容的提问来源于stack exchange,提问作者noobie
相关产品推荐
相关产品推荐

