c++ - 从 RGBA 到 HLS 的 cvtColor 不会修改任何内容
问题描述
亲爱的,我是opencv的新手,我不知道为什么,当我尝试从RGBA转换为HLS时,我没有收到任何更改。更好的解释是,我之前使用的是 3 通道图像,所以我正在读取并将 RGB 转换为 HLS/其他任何东西......现在,出于其他目的(我需要访问 alpha 通道),我正在阅读 BGR - 在 RGBA 中转换,然后通过 cv::Vec4b 处理 RGB 通道。但是在转换为 HLS 时,我没有收到任何更改。这是我的函数,它需要 2 个 cv::Mat 输入,'src' & 'dst',在 HLS 中转换它们,应用一些值,然后将它们重新转换为 RGBA,代码如下:
cvtColor(src, src, CV_RGBA2RGB);
cvtColor(src, src, CV_RGB2HLS);
cvtColor(dst, dst, CV_RGBA2RGB);
cvtColor(dst, dst, CV_RGB2HLS);
for(int i = 0; i < src.rows; i++)
for(int j = 0; j < src.cols; j++){
dst.at<cv::Vec3b>(i,j)[0] = cv::saturate_cast<uchar>(src.at<cv::Vec3b>(i,j)[0] + hue);
dst.at<cv::Vec3b>(i,j)[1] = cv::saturate_cast<uchar>(src.at<cv::Vec3b>(i,j)[1] + luminance);
dst.at<cv::Vec3b>(i,j)[2] = cv::saturate_cast<uchar>(src.at<cv::Vec3b>(i,j)[2] + saturation);
}
cvtColor(dst, dst, CV_HLS2RGB);
cvtColor(dst, dst, CV_RGB2RGBA);
cvtColor(src, src, CV_HLS2RGB);
cvtColor(src, src, CV_RGB2RGBA);
其中色相、亮度、饱和度是一些整数值。如前所述,仅使用 RGB 就可以了。现在,通过使用 RGBA,它不会改变任何东西。
解决方案
通过创建一个新的 Mat 现在在 RGBA 中工作:
cv::Mat hslIN = src.clone();
cv::Mat hslOUT;
cv::cvtColor(hslIN, hslIN, CV_RGBA2RGB);
cv::cvtColor(hslIN, hslIN, CV_RGB2HLS);
cv::cvtColor(hslIN, hslOUT, CV_RGB2HLS);
for(int i = 0; i < src.rows; i++)
for(int j = 0; j < src.cols; j++){
hslOUT.at<cv::Vec3b>(i,j)[0] = cv::saturate_cast<uchar>(hslIN.at<cv::Vec3b>(i,j)[0] + hue);
hslOUT.at<cv::Vec3b>(i,j)[1] = cv::saturate_cast<uchar>(hslIN.at<cv::Vec3b>(i,j)[1] + luminance);
hslOUT.at<cv::Vec3b>(i,j)[2] = cv::saturate_cast<uchar>(hslIN.at<cv::Vec3b>(i,j)[2] + saturation);
}
cv::cvtColor(hslOUT, hslOUT, CV_HLS2RGB);
cv::cvtColor(hslOUT, dst, CV_RGB2RGBA);
推荐阅读
- java - 如何为不同的 Apache Camel 路由设置几个不同的 WebFlux 客户端属性?
- rubygems - sqlite3 1.4.2 无法安装
- python-3.x - Pytorch - 在 GPU 上训练时在设备 1 上的副本 1 中捕获 StopIteration 错误
- julia - 从 Julia 调用 Femtolisp 函数
- python - 从子列表中删除一个空字符串
- python - 使用 Python 实时解析 XML 字符串
- docker - 如何更改 masakari 的 docker 存储库?
- powershell - 如果发生错误,阻止运行下一个脚本
- ios - 如何在 Swift 中按时间跟踪 CollectionView 单元格
- javascript - 使用 Electron 截取桌面截图