OpenCV 圖像讀寫和顯示
圖像讀取
ImRead() 函數可從文件中讀取圖像, 并生成一個Mat對象, ImRead() 函數支持絕大多數圖像格式.
注意點:
- 讀取后生成的Mat對象, 顏色空間為BGR,
- 第二參數為讀取方式, 常用的方式有:
. ImreadModes.Color: 彩色方式讀取, 即使原圖是4通道或者單通道, 生成的 Mat 永遠為三通道.
. ImreadModes.AnyColor: 按照自適應的方式讀取, 如果是灰度圖, 生成的Mat為單通道, 如果是彩色圖像, Mat將為三通道.
. ImreadModes.Unchanged : 如果原圖帶有alpha透明通道, 使用這個方式將同時讀取 alpha 通道
. ImreadModes.Grayscale: 按照灰度模式讀取, 生成Mat為單通道
圖像的展示
ImShow() 函數可以用于展示Mat, 注意點有:
- 僅能正常顯示BGR色彩空間的Mat, 如果是其他色彩空間的Mat可以顯示,但會失真, 如果要顯示其他色彩空間的Mat, 需要首先轉回BGR空間
- 兩次調用ImShow(), 如果第一個參數 winName 一樣, 則只顯示最后一次.
- 如果要將多個圖片拼在一起, 可以使用 Cv2.HConcat() 或 Cv2.VConcat(), 水平拼接要求圖片有相同高度和MatType類型, 垂直拼接也有類似的要求.
圖像保存
ImWrite(filename, mat, params) 函數, 圖片的格式需要通過文件的擴展名指定, 通常該函數只能用來保存8UC3或8UC1的BGR Mat圖像, 如果顏色空間或通道數不符合要求, 通常需要使用 convertTo() 或 cvtColor() 函數進行轉換.
private void showImages()
{
string pngFile = @"D:\my_workspace\opencv\images\draw.png";
var unchangedMode = Cv2.ImRead(pngFile, ImreadModes.Unchanged);
string unchangedModeInfo = $"channels:{unchangedMode.Channels()}, MatType: {unchangedMode.Type()}";
var colorMode = Cv2.ImRead(pngFile, ImreadModes.Color);
string colorModeInfo = $"channels:{colorMode.Channels()}, MatType: {colorMode.Type()}";
var anyColorMode = Cv2.ImRead(pngFile, ImreadModes.Color);
string anyColorModeInfo = $"channels:{anyColorMode.Channels()}, MatType: {anyColorMode.Type()}";
var grayscaleMode = Cv2.ImRead(pngFile, ImreadModes.Grayscale);
string grayscaleModeInfo = $"channels:{grayscaleMode.Channels()}, MatType: {grayscaleMode.Type()}";
Cv2.ImShow("unchangedMode", unchangedMode);
Cv2.ImShow("colorMode", colorMode);
Cv2.ImShow("anyColorMode", anyColorMode);
Cv2.ImShow("grayscaleMode", grayscaleMode);
Cv2.WaitKey();
Cv2.DestroyAllWindows();
}
幾種Mat讀取方式的通道和數據類型結果:
unchangedModeInfo 輸出: "channels:4, MatType: CV_8UC4"
colorModeInfo 輸出: "channels:3, MatType: CV_8UC3"
anyColorModeInfo 輸出: "channels:3, MatType: CV_8UC3"
grayscaleModeInfo 輸出: "channels:1, MatType: CV_8UC1"
圖像顯示截圖:


浙公網安備 33010602011771號