2015-05-26 47 views
2

我讀了一系列的JPG文件,然後使用OpenCV中的的ConvertTo(墊,CV_32FC3)函數將其轉換:麻煩轉換32FC3到8UC3圖像保存爲JPG OpenCV中

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); 

我想我必須將其轉換回CV_8UC3,然後我可以將它寫入jpg,但我不知道該怎麼做。我發現了一些其他的SO回答說我需要由255乘以縮放它(在的ConvertTo第三個參數()),但這樣做會使輸出全白。 100是一個更好的數字,但仍然存在大量的裁剪(更不用說255是8位圖像的最合理的數字)。這是正確的方法嗎?如果沒有,我如何正確保存圖像?

+0

什麼是轉換前'outImg'的最小值和最大值? – beaker

回答

1

要回答你的問題,轉換會一直

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);