天天看點

input預設顯示文字_OpenCV中圖像顯示你不知道的程式設計技巧

點選上方↑↑↑“OpenCV學堂”關注我

寫代碼我們是認真的!

閱讀本文大概需要 4min

OpenCV 中最常用的一個API函數 imshow 各種程式設計與應用技巧,是否有你以前一直想的,但是從來沒有成功過的操作!

最簡單的顯示方式

01

很多人學習OpenCV,學會前面兩個函數就是

Imread – 讀圖像Imshow – 顯示圖像
           

代碼看起來是這樣

Mat src = imread("D:/images/test.png");imshow("input", src);
           

覺得好簡單,真的好簡單,但是他們遇到大圖的時候,就會發現OpenCV無法完整顯示!想把多張圖像,顯示在一個視窗裡面,無法做到!顯示浮點數圖像全白!這些問題其實是你不了解如何正确使用imshow導緻,下面就分享一下本人的做法,也許你會有更好的,歡迎留言拍磚!

浮點數圖像顯示的正确姿勢

02

input預設顯示文字_OpenCV中圖像顯示你不知道的程式設計技巧

上面的圖像,左側是輸入圖像,中間與右側都是浮點數圖像的顯示結果。中間圖像對應的代碼如下:

Mat m1;src.convertTo(m1, CV_32F);imshow("m1", m1);
           

顯示的結果是全白色,沒有任何可見的資訊,難道是程式錯拉,程式沒有錯誤,Mat類型轉換從讀入圖像的CV_8UC3轉為CV_32FC3也沒有錯誤。修改一下代碼

Mat m2;src.convertTo(m2, CV_32F, 0.00392);imshow("m2", m2);
           

隻是在類型轉換的時候多加了一個參數,這個參數是什麼 1/255 = 0.00392

意思是把像素值從0~255 轉換為0~1之間的浮點數,然後再顯示,顯示結果對應上圖最右側。

解釋:原來imshow顯示浮點數的時候,隻支援0~1之間的浮點數顯示,超過1就認為是白色,是以在沒有對值域做rescale的時候,中間的浮點數Mat顯示隻能是白色。

如何在一個Mat對象中顯示多張圖

03

這個是很多人問我過的問題,其實很簡單,建立一個空白的Mat,把兩張圖的内容放進去,然後顯示新建立的Mat對象就可以把兩張圖顯示在一個視窗裡面。先看效果

input預設顯示文字_OpenCV中圖像顯示你不知道的程式設計技巧

代碼實作如下:

Mat src1 = imread("D:/images/lena.png");Mat src2 = imread("D:/images/t3.jpg");imshow("src1", src1);imshow("src2", src2);// 建構新圖像的大小int width = src1.cols + src2.cols;int height = max(src1.rows, src2.rows);Mat two = Mat::zeros(Size(width, height), src1.type());// 建構ROIRect r1(0, 0, src1.cols, src1.rows);Rect r2(0, 0, src2.cols, src2.rows);r2.x = src1.cols;// 内容copysrc1.copyTo(two(r1));src2.copyTo(two(r2));imshow("two images demo", two);waitKey(0);
           

上述代碼,基本上已經很通用,直接讀入任意兩張圖像都可以,唯一需要注意的是合并之後圖像太大無法顯示怎麼辦,沒關系,我們這就來搞定這個問題。

圖像太大,無法完整顯示怎麼辦

04

這個問題,其實不能怪imshow,主要原因出在opencv的預設視窗建立上面,在OpenCV中你可以直接調用imshow函數去顯示圖像,預設會建立一個同名的視窗,這個視窗的預設打開模式是WINDOW_AUTOSIZE, 這種情況下你是無法調整視窗大小的,很多人其實是掉到這個坑裡面去的,解決辦法就是代碼顯式建立一個可以調整大小的視窗,一行代碼搞定:

namedWindow("input", WINDOW_FREERATIO)
           

然後調用

imshow("input", yourMat)
           

顯示時候,注意保持視窗名稱一緻即可,再大的圖像顯示都沒有問題,前提是記憶體真的夠大!

千萬不要嘗試的Mat類型圖像顯示

Imshow其實隻支援 CV_8U與CV_32F 類型的資料顯示,其它Mat類型資料最好先轉換為這兩種類型之一再顯示,不然你可能會得到各種錯誤,各種掉坑。建議不要嘗試跟API對着幹,倒黴的隻會是你自己。

收藏此帖,從此圖像顯示不會再有問題。

input預設顯示文字_OpenCV中圖像顯示你不知道的程式設計技巧
input預設顯示文字_OpenCV中圖像顯示你不知道的程式設計技巧

推薦閱讀

請給我一個 在看

  • OpenCV實戰應用必備技能 | 子產品裁剪
  • 在Keras上實作GAN:建構消除圖檔模糊的應用
  • OpenCV二值圖像案例分析精選 | 第二期
input預設顯示文字_OpenCV中圖像顯示你不知道的程式設計技巧