无法将32FC3转换为8UC3以在OpenCV中将图像另存为jpg

时间:2015-05-26 13:40:02

标签: java opencv opencv4android

我正在阅读一系列jpgs,然后使用OpenCV的convertTo(Mat,CV_32FC3)函数进行转换:

    Mat outImg = Mat.zeros(tmp.size(), CV_32FC3);
    Mat curImg = new Mat();

    for (int i = 0; i < imgCount; i++) {
        fname = fp + String.format("%02d", i) + ".jpg";
        curImg = imread(fname);
        curImg.convertTo(curImg, CV_32FC3);
        Imgproc.accumulateWeighted(curImg, outImg, 0.01);
    }

    outImg.convertTo(outImg, CV_8UC3, ?????);
    imwrite(fp + "output" + "-" + curTime + ".jpg", outImg);

我想在将其写入jpg之前我必须将其转换回CV_8UC3,但我不知道该怎么做。我找到了一些其他的SO回答说我需要通过将它乘以255(convertTo()中的第三个参数)来缩放它,但这样做会使输出完全变白。 100是一个更好的数字,但仍然有大量的削波(更不用说255是8位图像的最大逻辑数)。这是正确的方法吗?如果没有,我该如何正确保存图像?

1 个答案:

答案 0 :(得分:2)

要回答您的问题,转换将是

curImg.convertTo(curImg, CV_32FC3, 1/255.0);
outImg.convertTo(outImg, CV_8UC3, 255);

但是,我认为你的意图是通过平均图像来降低噪音。如果是这种情况,则不需要转换为/ CV_32FC3。输入图像的深度是多少imread(使用默认标记CV_LOAD_IMAGE_COLOR)会将其加载为8位图像(例如8UC3假设彩色图像)。因此,我们可以平均图像而无需任何转换。

重写如下。

Mat outImg;
for (int i = 0; i < imgCount; i++) {
    fname = fp + String.format("%02d", i) + ".jpg";
    //load as 8 bit image what ever was input image depth
    Mat curImg = imread(fname);
    Imgproc.accumulateWeighted(curImg, outImg, 0.01);
}
imwrite(fp + "output" + "-" + curTime + ".jpg", outImg);