Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OpenCV Mat和Leptonica Pix之间转换 我需要在C++中实现OpenCV-MAT图像与LePoTimaPix图像格式之间的转换。这是用于8位灰度图像的二值化。_C++_Opencv_Mat_Leptonica_Pix - Fatal编程技术网

在OpenCV Mat和Leptonica Pix之间转换 我需要在C++中实现OpenCV-MAT图像与LePoTimaPix图像格式之间的转换。这是用于8位灰度图像的二值化。

在OpenCV Mat和Leptonica Pix之间转换 我需要在C++中实现OpenCV-MAT图像与LePoTimaPix图像格式之间的转换。这是用于8位灰度图像的二值化。,c++,opencv,mat,leptonica,pix,C++,Opencv,Mat,Leptonica,Pix,我发现这对我来说很有效,因为我需要的是实际转换为Mat格式,而不必将其与Tesseract API一起使用,这正是OP所要求的 以下是我使用的两个函数。pix8ToMat函数取自 Pix*mat8ToPix(cv::Mat*mat8) { Pix*pixd=pixCreate(mat8->size().width,mat8->size().height,8); 对于(int y=0;yrows;y++){ for(int x=0;xcols;x++){ pixSetPixel(pixd,x,y,

我发现这对我来说很有效,因为我需要的是实际转换为Mat格式,而不必将其与Tesseract API一起使用,这正是OP所要求的

以下是我使用的两个函数。pix8ToMat函数取自

Pix*mat8ToPix(cv::Mat*mat8)
{
Pix*pixd=pixCreate(mat8->size().width,mat8->size().height,8);
对于(int y=0;yrows;y++){
for(int x=0;xcols;x++){
pixSetPixel(pixd,x,y,(l_uint32)mat8->at(y,x));
}
}
返回pixd;
}
cv::Mat pix8ToMat(Pix*pix8)
{
cv::Mat Mat(cv::Size(pix8->w,pix8->h),cv_8UC1);
uint32_t*line=pix8->data;
对于(uint32_t y=0;yh;++y){
对于(uint32_t x=0;xw;++x){
mat.at(y,x)=获取数据字节(行,x);
}
行+=pix8->wpl;
}
返回垫;
}

要将pix转换为Mat,请在调用pix8toMat之前在@loot code中添加这些行

Pix *8bitPix = pixConvert1To8(NULL, pixt, 255, 0);
现在将此8bitPix发送到mat转换。
[它适用于二进制图像]

我知道我晚了4年,没人关心,但这项任务让我很沮丧,因为leptonica的文档太糟糕了。
的答案的问题是它不适用于彩色图像,因此这里是我对他的
pix8ToMat
的(可能是粗糙的)修改:

cv::Mat pixToMat(Pix *pix) {
    int width = pixGetWidth(pix);
    int height = pixGetHeight(pix);
    int depth = pixGetDepth(pix);

    cv::Mat mat(cv::Size(width, height), depth == 1 ? CV_8UC1 : CV_8UC3);

    for (uint32_t y = 0; y < height; ++y) {
        for (uint32_t x = 0; x < width; ++x) {
            if (depth == 1) {
                l_uint32 val;
                pixGetPixel(pix, x, y, &val);
                mat.at<uchar>(cv::Point(x, y)) = static_cast<uchar>(255 * val);
            } else {
                l_int32 r, g, b;
                pixGetRGBPixel(pix, x, y, &r, &g, &b);

                cv::Vec3b color(b, g, r);
                mat.at<cv::Vec3b>(cv::Point(x, y)) = color;
            }
        }
    }

    return mat;
}
cv::Mat pixToMat(Pix*Pix){
int width=pixGetWidth(pix);
int height=pixGetHeight(pix);
int-depth=pixGetDepth(pix);
cv::垫(cv::尺寸(宽度、高度)、深度==1?cv_8UC1:cv_8UC3);
对于(uint32_t y=0;y
本打算将此作为答案发布,但不太合适,因此我将回答自己的问题。我不确定此代码是否真的有效。如果源图像是灰度的,并且我们想要输出一个RGB图像,那么它可能会失败。@AurusHuang我认为问题是
mat.at(y,x)
。Opencv似乎不支持使用uint32@yode不,似乎是,但实际上不是,根据我对Mat和PIX*中字节顺序的观察。无论源图像的颜色模式和深度如何,我都希望它们之间能够进行有效和正确的转换。顺便问一下,为什么leptonica不使用原始存储?我标记为正确答案,因为正如您所说,它支持彩色图像。我还没有测试,但看起来应该可以正常工作。如果将深度检查移出for循环,它的性能可能会更好。@Prosoichelovek,从Mat到Pix的转换如何,这是相反的过程?
cv::Mat pixToMat(Pix *pix) {
    int width = pixGetWidth(pix);
    int height = pixGetHeight(pix);
    int depth = pixGetDepth(pix);

    cv::Mat mat(cv::Size(width, height), depth == 1 ? CV_8UC1 : CV_8UC3);

    for (uint32_t y = 0; y < height; ++y) {
        for (uint32_t x = 0; x < width; ++x) {
            if (depth == 1) {
                l_uint32 val;
                pixGetPixel(pix, x, y, &val);
                mat.at<uchar>(cv::Point(x, y)) = static_cast<uchar>(255 * val);
            } else {
                l_int32 r, g, b;
                pixGetRGBPixel(pix, x, y, &r, &g, &b);

                cv::Vec3b color(b, g, r);
                mat.at<cv::Vec3b>(cv::Point(x, y)) = color;
            }
        }
    }

    return mat;
}