OpenCV添加邊框到您的圖像

2018-09-07 11:03 更新

目標

在本教程中,您將學(xué)習(xí)如何:

  • 使用OpenCV函數(shù)cv :: copyMakeBorder設(shè)置邊框(額外填充到您的圖像)。

理論

注意
下面的解釋屬于Bradski和Kaehler 的“ 學(xué)習(xí)OpenCV ”一書。
  1. 在前面的教程中,我們學(xué)會了使用卷積來對圖像進行操作。自然產(chǎn)生的一個問題是如何處理邊界。如果評估點位于圖像的邊緣,我們?nèi)绾尉矸e它們?
  2. 大多數(shù)OpenCV功能是將給定的圖像復(fù)制到另一個稍大的圖像上,然后自動填充邊界(通過下面的示例代碼中解釋的任何方法)。這樣,可以在所需要的像素上執(zhí)行卷積而沒有問題(在操作完成之后,額外的填充被切割)。
  3. 在本教程中,我們將簡要介紹如何為圖像定義額外的填充(邊框):BORDER_CONSTANT:使用常量值(即黑色或0)來填充圖像0BORDER_REPLICATE:原始邊緣的行或列被復(fù)制到額外的邊框?!笆貏t”部分將會更清楚地看到這一點。

Code

  1. 這個程序是做什么的?
    • 加載圖像
    • 讓用戶選擇在輸入圖像中使用什么樣的填充。有兩個選擇:
      1. 常數(shù)值邊框:對整個邊框應(yīng)用一個常量值的填充。該值將隨機每0.5秒更新一次。
      2. 復(fù)制邊框:邊框?qū)脑紙D像邊緣的像素值復(fù)制。
    • 當用戶按“ESC”時程序完成
  2. 教程代碼如下所示。您也可以從這里下載
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
using namespace cv;
Mat src, dst;
int top, bottom, left, right;
int borderType;
const char* window_name = "copyMakeBorder Demo";
RNG rng(12345);
int main( int argc, char** argv )
{
  String imageName("../data/lena.jpg"); // by default
  if (argc > 1)
  {
      imageName = argv[1];
  }
  src = imread( imageName, IMREAD_COLOR ); // Load an image
  if( src.empty() )
    {
      printf(" No data entered, please enter the path to an image file \n");
      return -1;
    }
  printf( "\n \t copyMakeBorder Demo: \n" );
  printf( "\t -------------------- \n" );
  printf( " ** Press 'c' to set the border to a random constant value \n");
  printf( " ** Press 'r' to set the border to be replicated \n");
  printf( " ** Press 'ESC' to exit the program \n");
  namedWindow( window_name, WINDOW_AUTOSIZE );
  top = (int) (0.05*src.rows); bottom = (int) (0.05*src.rows);
  left = (int) (0.05*src.cols); right = (int) (0.05*src.cols);
  dst = src;
  imshow( window_name, dst );
  for(;;)
       {
         char c = (char)waitKey(500);
         if( c == 27 )
           { break; }
         else if( c == 'c' )
           { borderType = BORDER_CONSTANT; }
         else if( c == 'r' )
           { borderType = BORDER_REPLICATE; }
         Scalar value( rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255) );
         copyMakeBorder( src, dst, top, bottom, left, right, borderType, value );
         imshow( window_name, dst );
       }
  return 0;
}

說明

  • 首先我們聲明我們要使用的變量:
Mat src, dst;
int top, bottom, left, right;
int borderType;
const char* window_name = "copyMakeBorder Demo";
RNG rng(12345);

特殊的注意力值應(yīng)該是隨機數(shù)發(fā)生器的變量rng。我們用它來生成隨機邊框顏色,我們將盡快看到。

  • 像往常一樣,我們加載我們的源圖像src
  String imageName("../data/lena.jpg"); // by default
  if (argc > 1)
  {
      imageName = argv[1];
  }
  src = imread( imageName, IMREAD_COLOR ); // Load an image
  if( src.empty() )
    {
      printf(" No data entered, please enter the path to an image file \n");
      return -1;
    }
  • 在給出如何使用程序的簡短介紹后,我們創(chuàng)建一個窗口:
  namedWindow(window_name,WINDOW_AUTOSIZE);
  • 現(xiàn)在我們初始化定義邊框大小的參數(shù)(topbottomleft and right)。我們給它們一個src大小的5%的值。
  top =(int)(0.05 * src.rows); bottom =(int)(0.05 * src.rows);
  left =(int)(0.05 * src.cols); right =(int)(0.05 * src.cols);
  • 程序運行在for循環(huán)中。如果用戶按“c”或“r”,則borderType變量分別取BORDER_CONSTANTBORDER_REPLICATE的值:
         char c = (char)waitKey(500);
         if( c == 27 )
           { break; }
         else if( c == 'c' )
           { borderType = BORDER_CONSTANT; }
         else if( c == 'r' )
           { borderType = BORDER_REPLICATE; }
  • 在每次迭代(0.5秒后),變量被更新...
         Scalar value( rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255) );

RNG變量rng生成的隨機值。該值是隨機抽取的數(shù)字范圍[0,255]

  • 最后,我們調(diào)用函數(shù)cv :: copyMakeBorder來應(yīng)用相應(yīng)的填充:
         copyMakeBorder(src,dst,top,bottom,left,right,borderType,value);

參數(shù)解釋:

  1. src:源圖像
  2. dst:目的地圖像
  3. topbottomleftright:圖像每邊邊框的長度(以像素為單位)。我們將它們定義為圖像的原始大小的5%。
  4. borderType:定義應(yīng)用什么類型的邊框。對于該示例,它可以是常量或復(fù)制的。
  5. value:如果borderType為BORDER_CONSTANT,則這是用于填充邊框像素的值。
  • 我們在以前創(chuàng)建的圖像中顯示輸出圖像
         imshow(window_name,dst);

結(jié)果

  1. 在編譯上面的代碼之后,可以執(zhí)行它作為參數(shù)作為圖像的路徑。結(jié)果應(yīng)該是:

  • 默認情況下,它的邊框設(shè)置為BORDER_CONSTANT。因此,將顯示連續(xù)的隨機彩色邊界。
  • 如果按“r”,邊框?qū)⒊蔀檫吘壪袼氐母北尽?/li>
  • 如果按“c”,隨機彩色邊框?qū)⒃俅纬霈F(xiàn)
  • 如果按“ESC”,程序?qū)⑼顺觥?/li>

下面的屏幕截圖顯示邊框如何更改顏色以及BORDER_REPLICATE選項的外觀:

OpenCV添加邊框到您的圖像


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號