2013-06-20 70 views
3

我正在研究如何在不使用OpenCV的直接轉換函數的情況下將Bayer模式轉換爲RGB圖像。我已經使用了雙線性插值並使其運行,但我想通過使用Freeman方法來提高質量。該方法需要中值濾波器。 OpenCV具有這樣的中值布爾函數。但我無法使用此功能。當我應用medianBlur的cv :: Mat類型爲CV_8UC1時,它可以工作,但如果它是CV_32S類型,那麼它不起作用。 這確實工作:當Mat是CV_32S類型時,OpenCV MedianBlur函數崩潰

redGreenMedian.create(input.size(), CV_32S); 
    blueGreenMedian.create(input.size(), CV_32S); 
    blueMinusGreen.create(input.size(), CV_32S); 
    redMinusGreen.create(input.size(), CV_32S); 
    for(int i = 1; i <= 3; i += 2) 
    { 
      cv::medianBlur(redMinusGreen, redGreenMedian, i); 
      cv::medianBlur(blueMinusGreen, blueGreenMedian, i); 
    } 

如果我改變這一切CV_32S到CV_8UC1然後它工作。在調試時,我發現它在第二次迭代中崩潰,而不是第一次崩潰。但是,我需要它運行兩個迭代。這確實工作單獨寫的時候也:

cv::medianBlur(redMinusGreen, redGreenMedian, 3); 

順便說一句,我沒有使用CV_32S,但我需要存儲在矩陣負數的能力。
注意:我已經嘗試使矩陣中的所有數字爲正,然後使用medianBlur,但它仍然無效。
所有幫助表示讚賞。提前致謝。

+0

yup,段錯誤不處理輸入是不正常的!由於'medianBlur'函數,我只看到崩潰。 – dashesy

回答

5

OpenCV documentation似乎是非常清楚:

SRC - 輸入1-,3-,或4通道的圖像;當ksize爲3或5時,圖像深度應爲CV_8U,CV_16UCV_32F,對於較大的光圈尺寸,它只能是CV_8U

由於您需要滿足簽名值,我認爲您最好的選擇是使用CV_32F

此外,文檔說

ksize - 孔徑線性尺寸;它必須是奇數和大於1,例如:3,5,7

你的環路適用的1和3的尺寸(如果我正確讀取您的代碼),其中第一個是無效的,這可能解釋爲什麼你的第一次迭代不會崩潰(因爲它會提前失敗)。

+0

謝謝。 CV_32F的作品。我從1開始迭代,因爲我遵循以下示例中的示例:http://docs.opencv.org/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.html –