使用单色 QImage

Posted

技术标签:

【中文标题】使用单色 QImage【英文标题】:Working With Monochrome QImage 【发布时间】:2012-11-25 02:25:13 【问题描述】:

我正在尝试从 QPixmap 中提取位掩码并将其传递给 OpenCV。我的位掩码是通过“绘画”操作创建的。

到目前为止,我的过程是:

    创建一个QPixmap, QPixmap::fill(QColor(0,0,0,0)) 并使用QPainterQPainter::setPen(QColor(255,0,0,255))QPainter::drawPoint(mouse_event->pos()

    准备好提取位掩码 QPixmap::toImage() 然后是 QImage::createAlphaMask(),据记录返回 QImage::Format_MonoLSB

我现在正式陷入困境。我在破译文档时遇到问题:

存储在 QImage 中的每个像素都由一个整数表示。整数的大小因格式而异。 QImage 支持由 Format 枚举描述的几种图像格式。

单色图像使用 1 位索引存储到最多包含两种颜色的颜色表中。有两种不同类型的单色图像:大端(MSB 优先)或小端(LSB 优先)位顺序。

...

createAlphaMask() 函数从该图像中的 alpha 缓冲区构建并返回一个 1-bpp 掩码...

还有:

QImage::Format_MonoLSB --- 2 --- 图像以每像素 1 位存储。字节首先与较低有效位 (LSB) 一起打包。

谁能帮我解释一下如何将它转移到 cv::Mat 中。

另外,我应该读到每个像素将是一个unsigned char 还是我们将存储 8 个像素。

【问题讨论】:

我对如何使用它感到困惑。从中提取数据,并将其移动到 cv::Mat。但我使用内存分析器来检查输出。我马上贴出一个方法。 【参考方案1】:

我已经成功地将单色 QImage 传输到 cv::Mat。我希望以下代码对其他人有所帮助:

重要编辑:此代码存在重大错误。 bytesPerLine 在某些机器上是字节对齐和字对齐的。因此 width() 应该与 cur_byte 一起使用

QImage mask; //Input from wherever
cv::Mat workspace;
if(!mask.isNull() && mask.depth() == 1)

    if(mask.width() != workspace.cols || mask.height() != workspace.rows)
        workspace.create(mask.height(), mask.width(), CV_8UC1);

    for(int i = 0; i < mask.height(); ++i)
    
        unsigned char * cur_row = mask.scanLine(i);
        //for(int cur_byte = 0, j = 0; cur_byte < mask.bytesPerLine(); ++cur_byte) wrong
        for(int cur_byte = 0, j = 0; j < mask.width(); ++cur_byte)
        
            unsigned char pixels = cur_row[cur_byte];
            for(int cur_bit = 0; cur_bit < 8; ++cur_bit, ++j)
            
                if(pixels & 0x01) //Least Significant Bit
                    workspace.at<unsigned char>(i, j) = 0xff;
                else
                    workspace.at<unsigned char>(i, j) = 0x00;
                 pixels = pixels >> 1; //Least Significant Bit
            
        
     
 

【讨论】:

以上是关于使用单色 QImage的主要内容,如果未能解决你的问题,请参考以下文章

9.1 使用QPxmap类加载图片

9.2 使用QImage类加载图片

Qt-绘图设备

使用 QImage::loadFromData 将 cv::mat 转换为 QImage

使用 PySide 将 QImage 转换为 Numpy 数组

使用 QT-=gui 时替代 QImage