2015-09-17 34 views
1

我遇到了這個代碼:的OpenCV的ConvertTo()

image.convertTo(temp_image,CV_16SC3); 

我看到的ConvertTo()函數的說明從here,但什麼混淆我是image。我們如何閱讀上面的代碼? imagetemp_image之間的關係是什麼?

謝謝。

回答

1

第一個是,第二個 - 目的地。所以,它需要鏡像,將其轉換爲類型CV_16SC3並存儲在temp_image中。

2

圖像是像素信息的矩陣(即,1080p圖像將是1,920 × 1,080矩陣,其中每個條目包含該像素的rbg值)。您所做的只是將該矩陣(每個像素條目,迭代地)重新格式化爲一個新類型(CV_16SC3),以便它可以被不同的程序讀取。

temp_image是基於image格式化爲CV_16SC3的新像素信息矩陣。

+0

@Miki,啊是的,我的壞,更新 – asdf

3

這裏的其他答案是正確的,但缺乏一些細節。讓我嘗試。

image.convertTo(temp_image,CV_16SC3); 

你有圖像0​​和目的地圖像0​​。未指定的image類型,但大概是CV_8UC3CV_32FC3,即,3通道圖像(因爲convertTo不改變信道的數量),其中,每個信道具有深度爲8位(unsigned char,CV_ 8U C3 )或32位(float,CV_ 32F C3)。

這行代碼會改變每個通道的深度,因此temp_image的每個通道的深度爲16位(short)。特別是它是signed short,因爲類型說明符有S:CV_16 S C3。

請注意,如果您正在縮小的深度,如從floatsigned short的話,那麼saturate_cast將確保在temp_image所有值將在正確的範圍內,即[-32768,32767]爲signed short

爲什麼你需要改變圖像的深度?

  1. 某些OpenCV功能需要具有特定深度的輸入圖像。
  2. 您需要一個矩陣來包含不同範圍的值。例如。如果您需要總結(或減去)一些圖像CV_8UC3(最終BGR圖像),則最好將結果存儲在CV_16SC3中,否則由於飽和度可能會得到錯誤結果,因爲CV_8U圖像的範圍是[0,255 ]
  3. 您使用imread閱讀,或想與imwrite存儲16位深度的圖像。這通常用於醫療或圖形應用(AFAIK),以允許更廣泛的顏色。但是,大多數顯示器不支持16位圖像可視化。
  4. 有可能是其他情況,讓我知道如果我錯過了一個重要的你。
+0

保存此答案!太棒了 – asdf

+0

@asdf謝謝! :d – Miki