C++ 使用单色图像

C++ 使用单色图像,c++,qt,opencv,C++,Qt,Opencv,我试图从QPixmap中提取一个位掩码并将其传递给OpenCV。我的位掩码是通过绘制操作创建的 到目前为止,我的过程是: 创建一个QPixmap,QPixmap::fillQColor0,0,0,0,并将QPaint与QPaint::setPenQColor255,0,0255一起使用到QPaint::drawPointmouse_事件->位置 准备好提取位掩码QPixmap::toImage后,再提取QImage::createAlphaMask,该文件将返回QImage::Format\u

我试图从QPixmap中提取一个位掩码并将其传递给OpenCV。我的位掩码是通过绘制操作创建的

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

创建一个QPixmap,QPixmap::fillQColor0,0,0,0,并将QPaint与QPaint::setPenQColor255,0,0255一起使用到QPaint::drawPointmouse_事件->位置

准备好提取位掩码QPixmap::toImage后,再提取QImage::createAlphaMask,该文件将返回QImage::Format\u monosb

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

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

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

createAlphaMask函数从该图像中的alpha缓冲区生成并返回一个1-bpp掩码

此外:

QImage::Format_monosb-2——图像以每像素1位的形式存储。字节首先用低有效位LSB进行压缩

有谁能帮我澄清一下如何将其转换成简历::Mat


另外,我应该读到每个像素都是一个无符号字符,还是一位存储8个像素。

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

重要编辑:此代码有一个主要错误。在某些机器上,BytePerline是字节对齐的,也是字对齐的。因此,宽度应与cur_字节一起使用


我成功地将单色图像转移到cv::Mat。我希望以下代码对其他人有所帮助:

重要编辑:此代码有一个主要错误。在某些机器上,BytePerline是字节对齐的,也是字对齐的。因此,宽度应与cur_字节一起使用


我对如何使用它感到困惑。从中提取数据,并将其移动到cv::Mat。但是我使用内存分析器来检查输出。我马上就要发布一个方法。我对如何使用它感到困惑。从中提取数据,并将其移动到cv::Mat。但是我使用内存分析器来检查输出。我马上就要发布一个方法。
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
            }
        }
     }
 }