经实践,发现一些诡异的事情,欢迎留言探讨:
const &修饰的函参(或值传递的函参)竟然被改变了,r/b被调换。不符合c++常识。
原因可能是指针直接指向了函参的数据内存,r/b被改, 下述代码中的(void)image.constBits()或者(const uchar )mat.data
不过,A.rgbSwapped()不会更改A的数据。
以防万一,在cvtColor变更r/b的地方,单独搞了个变量来承接。
cv::Mat ImgFormatConvert::QImage2Mat(const QImage& image)
{
cv::Mat mat,mat_out; //如果把mat_out变更为mat,那么参数image的r/b被调换。即使被const修饰,依然被更改,比较诡异。参数变为值传递,也依然被更改。
switch (image.format())
{
case QImage::Format_RGB32: //一般Qt读入本地彩色图后为此格式
mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
cv::cvtColor(mat, mat_out, cv::COLOR_BGRA2BGR); //转3通道,OpenCV一般用3通道的
break;
case QImage::Format_RGB888:
mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
cv::cvtColor(mat, mat_out, cv::COLOR_RGB2BGR);
break;
case QImage::Format_Indexed8:
mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
break;
}
return mat_out;
}
QImage ImgFormatConvert::Mat2QImage(const cv::Mat& mat)
{
QImage image;
if (mat.type() == CV_8UC1 || mat.type() == CV_8U)
{
image=QImage((const uchar*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_Grayscale8);
}
else if (mat.type() == CV_8UC3)
{
image=QImage((const uchar*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888).rgbSwapped(); //mat部分不会被改变
}
return image;
}
原文链接: https://www.cnblogs.com/xixixing/p/15797971.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/185321
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!