1. 程式人生 > >OpenCV在影象上畫線、矩形、橢圓、多邊形、填充的多邊形、圓、顯示文字

OpenCV在影象上畫線、矩形、橢圓、多邊形、填充的多邊形、圓、顯示文字

OpenCV在影象上隨機畫直線、橢圓、多邊形、圓、顯示文字

程式碼如下:

/**
 * @file Drawing_2.cpp
 * @brief Simple sample code
 */

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <stdio.h>

using namespace cv;

/// Global Variables
const int NUMBER = 100;
const int DELAY = 5;

const int window_width = 900;
const int window_height = 600;
int x_1 = -window_width/2;
int x_2 = window_width*3/2;
int y_1 = -window_width/2;
int y_2 = window_width*3/2;

/// Function headers
static Scalar randomColor( RNG& rng );
int Drawing_Random_Lines( Mat image, char* window_name, RNG rng );
int Drawing_Random_Rectangles( Mat image, char* window_name, RNG rng );
int Drawing_Random_Ellipses( Mat image, char* window_name, RNG rng );
int Drawing_Random_Polylines( Mat image, char* window_name, RNG rng );
int Drawing_Random_Filled_Polygons( Mat image, char* window_name, RNG rng );
int Drawing_Random_Circles( Mat image, char* window_name, RNG rng );
int Displaying_Random_Text( Mat image, char* window_name, RNG rng );
int Displaying_Big_End( Mat image, char* window_name, RNG rng );


/**
 * @function main
 */
int main( void )
{
  int c;

  /// Start creating a window
  char window_name[] = "Drawing_2 Tutorial";

  /// Also create a random object (RNG)
  RNG rng( 0xFFFFFFFF );

  /// Initialize a matrix filled with zeros
  Mat image = Mat::zeros( window_height, window_width, CV_8UC3 );
  /// Show it in a window during DELAY ms
  imshow( window_name, image );
  waitKey( DELAY );

  /// 畫線
  c = Drawing_Random_Lines(image, window_name, rng);
  if( c != 0 ) return 0;

  /// 矩形
  c = Drawing_Random_Rectangles(image, window_name, rng);
  if( c != 0 ) return 0;

  /// 橢圓
  c = Drawing_Random_Ellipses( image, window_name, rng );
  if( c != 0 ) return 0;

  /// 多邊形
  c = Drawing_Random_Polylines( image, window_name, rng );
  if( c != 0 ) return 0;

  /// 填充的多邊形
  c = Drawing_Random_Filled_Polygons( image, window_name, rng );
  if( c != 0 ) return 0;

  /// 圓
  c = Drawing_Random_Circles( image, window_name, rng );
  if( c != 0 ) return 0;

  /// 隨機位置顯示文字
  c = Displaying_Random_Text( image, window_name, rng );
  if( c != 0 ) return 0;

  /// 顯示文字
  c = Displaying_Big_End( image, window_name, rng );
  if( c != 0 ) return 0;

  waitKey(0);
  return 0;
}

/// Function definitions

/**
 * @function randomColor
 * @brief Produces a random color given a random object
 */
static Scalar randomColor( RNG& rng )
{
  int icolor = (unsigned) rng;
  return Scalar( icolor&255, (icolor>>8)&255, (icolor>>16)&255 );
}


/**
 * @function 隨機畫線
 */
int Drawing_Random_Lines( Mat image, char* window_name, RNG rng )
{
  Point pt1, pt2;

  for( int i = 0; i < NUMBER; i++ )
  {
    pt1.x = rng.uniform( x_1, x_2 );
    pt1.y = rng.uniform( y_1, y_2 );
    pt2.x = rng.uniform( x_1, x_2 );
    pt2.y = rng.uniform( y_1, y_2 );

    line( image, pt1, pt2, randomColor(rng), rng.uniform(1, 10), 8 );
    imshow( window_name, image );
    if( waitKey( DELAY ) >= 0 )
      { return -1; }
  }

  return 0;
}

/**
 * @function 畫矩形
 */
int Drawing_Random_Rectangles( Mat image, char* window_name, RNG rng )
{
  Point pt1, pt2;
  int lineType = 8;
  int thickness = rng.uniform( -3, 10 );

  for( int i = 0; i < NUMBER; i++ )
  {
    pt1.x = rng.uniform( x_1, x_2 );
    pt1.y = rng.uniform( y_1, y_2 );
    pt2.x = rng.uniform( x_1, x_2 );
    pt2.y = rng.uniform( y_1, y_2 );

    rectangle( image, pt1, pt2, randomColor(rng), MAX( thickness, -1 ), lineType );

    imshow( window_name, image );
    if( waitKey( DELAY ) >= 0 )
      { return -1; }
  }

  return 0;
}

/**
 * @function 隨機橢圓
 */
int Drawing_Random_Ellipses( Mat image, char* window_name, RNG rng )
{
  int lineType = 8;

  for ( int i = 0; i < NUMBER; i++ )
  {
    Point center;
    center.x = rng.uniform(x_1, x_2);
    center.y = rng.uniform(y_1, y_2);

    Size axes;
    axes.width = rng.uniform(0, 200);
    axes.height = rng.uniform(0, 200);

    double angle = rng.uniform(0, 180);

    ellipse( image, center, axes, angle, angle - 100, angle + 200,
             randomColor(rng), rng.uniform(-1,9), lineType );

    imshow( window_name, image );

    if( waitKey(DELAY) >= 0 )
      { return -1; }
  }

  return 0;
}

/**
 * @function 多邊形
 */
int Drawing_Random_Polylines( Mat image, char* window_name, RNG rng )
{
  int lineType = 8;

  for( int i = 0; i< NUMBER; i++ )
  {
    Point pt[2][3];
    pt[0][0].x = rng.uniform(x_1, x_2);
    pt[0][0].y = rng.uniform(y_1, y_2);
    pt[0][1].x = rng.uniform(x_1, x_2);
    pt[0][1].y = rng.uniform(y_1, y_2);
    pt[0][2].x = rng.uniform(x_1, x_2);
    pt[0][2].y = rng.uniform(y_1, y_2);
    pt[1][0].x = rng.uniform(x_1, x_2);
    pt[1][0].y = rng.uniform(y_1, y_2);
    pt[1][1].x = rng.uniform(x_1, x_2);
    pt[1][1].y = rng.uniform(y_1, y_2);
    pt[1][2].x = rng.uniform(x_1, x_2);
    pt[1][2].y = rng.uniform(y_1, y_2);

    const Point* ppt[2] = {pt[0], pt[1]};
    int npt[] = {3, 3};

    polylines(image, ppt, npt, 2, true, randomColor(rng), rng.uniform(1,10), lineType);

    imshow( window_name, image );
    if( waitKey(DELAY) >= 0 )
      { return -1; }
  }
  return 0;
}

/**
 * @function 填充的多邊形
 */
int Drawing_Random_Filled_Polygons( Mat image, char* window_name, RNG rng )
{
  int lineType = 8;

  for ( int i = 0; i < NUMBER; i++ )
  {
    Point pt[2][3];
    pt[0][0].x = rng.uniform(x_1, x_2);
    pt[0][0].y = rng.uniform(y_1, y_2);
    pt[0][1].x = rng.uniform(x_1, x_2);
    pt[0][1].y = rng.uniform(y_1, y_2);
    pt[0][2].x = rng.uniform(x_1, x_2);
    pt[0][2].y = rng.uniform(y_1, y_2);
    pt[1][0].x = rng.uniform(x_1, x_2);
    pt[1][0].y = rng.uniform(y_1, y_2);
    pt[1][1].x = rng.uniform(x_1, x_2);
    pt[1][1].y = rng.uniform(y_1, y_2);
    pt[1][2].x = rng.uniform(x_1, x_2);
    pt[1][2].y = rng.uniform(y_1, y_2);

    const Point* ppt[2] = {pt[0], pt[1]};
    int npt[] = {3, 3};

    fillPoly( image, ppt, npt, 2, randomColor(rng), lineType );

    imshow( window_name, image );
    if( waitKey(DELAY) >= 0 )
       { return -1; }
  }
  return 0;
}

/**
 * @function 圓
 */
int Drawing_Random_Circles( Mat image, char* window_name, RNG rng )
{
  int lineType = 8;

  for (int i = 0; i < NUMBER; i++)
  {
    Point center;
    center.x = rng.uniform(x_1, x_2);
    center.y = rng.uniform(y_1, y_2);

    circle( image, center, rng.uniform(0, 300), randomColor(rng),
            rng.uniform(-1, 9), lineType );

    imshow( window_name, image );
    if( waitKey(DELAY) >= 0 )
      { return -1; }
  }

  return 0;
}

/**
 * @function 顯示文字
 */
int Displaying_Random_Text( Mat image, char* window_name, RNG rng )
{
  int lineType = 8;

  for ( int i = 1; i < NUMBER; i++ )
  {
    Point org;
    org.x = rng.uniform(x_1, x_2);
    org.y = rng.uniform(y_1, y_2);

    putText( image, "Testing text rendering", org, rng.uniform(0,8),
             rng.uniform(0,100)*0.05+0.1, randomColor(rng), rng.uniform(1, 10), lineType);

    imshow( window_name, image );
    if( waitKey(DELAY) >= 0 )
      { return -1; }
  }

  return 0;
}顯示文字Displaying_Big_End
 */
int Displaying_Big_End( Mat image, char* window_name, RNG )
{
  Size textsize = getTextSize("OpenCV forever!", FONT_HERSHEY_COMPLEX, 3, 5, 0);
  Point org((window_width - textsize.width)/2, (window_height - textsize.height)/2);
  int lineType = 8;

  Mat image2;

  for( int i = 0; i < 255; i += 2 )
  {
    image2 = image - Scalar::all(i);
    putText( image2, "OpenCV forever!", org, FONT_HERSHEY_COMPLEX, 3,
             Scalar(i, i, 255), 5, lineType );

    imshow( window_name, image2 );
    if( waitKey(DELAY) >= 0 )
       { return -1; }
  }

  return 0;
}

結果:
  1. 隨機畫線:

    Drawing_2_Tutorial_Result_0.jpg
  2. 矩形和橢圓 Drawing_2_Tutorial_Result_2.jpg
  3. 多邊形

    Drawing_2_Tutorial_Result_3.jpg
  4. 填充的多邊形(三角形)和圓 Drawing_2_Tutorial_Result_5.jpg
  5. 最後,"Testing Text Rendering"*將會以不同的字型,大小、顏色出現在不同的位置.最後,顯示”OpenCV forever!“

   Drawing_2_Tutorial_Result_big.jpg



相關推薦

OpenCV影象矩形橢圓多邊形填充多邊形顯示文字

OpenCV在影象上隨機畫直線、橢圓、多邊形、圓、顯示文字 程式碼如下: /** * @file Drawing_2.cpp * @brief Simple sample code */ #include <opencv2/core.hpp> #inc

opencv影象矩形

實現程式碼: #include "opencv2/opencv.hpp" using namespace cv; void main() {     Mat src = imread("bird.jpg");     Rect re

opencv-視訊處理--(越

視訊處理中,經常有做一些行人、車輛或者其它運動物體越線檢測,越界檢測。原視訊流:下面用opencv介紹兩種方式,畫直線(越線、拌線):第一種:固定第一幀,或者暫停視訊,在固定的一幀中完成畫直線的功能#include<iostream> using namespac

Opencv影象識別從零到精通(24)------漫水填充,種子填充,區域生長孔洞填充

         可以說從這篇文章開始,就結束了影象識別的入門基礎,來到了第二階段的學習。在平時處理二值影象的時候,除了要進行形態學的一些操作,還有有上一節講到的輪廓連通區域的面積周長標記等,還有一個最常見的就是孔洞的填充,opencv這裡成為漫水填充,其實也可以叫種子填

openCV 和GDI效率對照

ref sca lan sign ng2 trac 放大 平臺 gpu 一、 因為項目須要,原來用GDI做的畫線的功能。新的項目中考慮到垮平臺的問題。打算用openCV來實現。故此做個效率對照。 二、 2點做一條線,來測試效率。 用了相同的畫板大小---256*256的

畫紙

 佈局檔案  activity_main <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/an

C++ Opencv——影象處理(預處理+矩形物體分割)

 影象預處理分割目標 // ROI提取 Mat Image_ROI(Mat frame) { Mat gray, bw, img, bkup; /*目標提取——預處理——Mat ROI*/ /*預處理很重要——直接找到目標*/ //預處理很重要——直接找到目標 // 灰度化

如何使用Graphics2D在一張圖片(包括箭頭)

有這樣一個需求,在一張圖片上畫幾條線並儲存,如圖所示: 已知各個點的x,y座標,座標範圍是[0.000,1],即將橫縱方向分成1000份。 我們可以使用java.awt.Graphics2D的庫來實現。 Graphics2D在Graphics類提供繪製各種基本的幾何圖形的基礎上進行

在MFC的Picture控制元件和框

CPen pen(PS_SOLID,5,RGB(255,0,0));//建立一個畫筆工具 //CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); CWnd *pwnd=GetDlgItem(IDC_ShowImg)

qt 中時如何設定筆的顏色和填充

在上一次介紹中已經實現了自定義控制元件,並把Widget 放入了主介面中,畫了一個圓,具體可參考“QT 自定義視窗” 下面我們介紹一下如何設定畫筆顏色和所畫圖形的填充顏色。 畫筆顏色: void CircleWidget::paintEvent(QPaintEvent *event) {

OpenCV矩形圓形

程式碼位置:9-DrawingLineRectangleCircle.py import numpy as np import cv2 import matplotlib.pyplot as plt def show(image): plt.imshow(image)

PHP合成圖片生成文字居中對齊矩形三角形多邊形圖片抗鋸齒不失真 高效能原始碼示例

function generateImg($source, $text1, $text2, $text3, $font = './msyhbd.ttf') { $date = '' . date ( 'Ymd' ) . '/'; $img = $date . md5 ( $source

OpenCV影象處理】二十二影象邊緣檢測(

→影象邊緣檢測的目的是檢測鄰域內灰度明顯變化的畫素,常用一階差分和二階差分來進行邊緣檢測 →數字影象中的邊緣是由鄰域內灰度值明顯變化的畫素構成,邊緣檢測主要是影象灰度的度量檢測和定位 →影象的邊緣有方向和幅值兩個屬性,沿邊緣方向畫素灰度值變化平緩或不發生變化,而垂直於邊緣方

opencv學習——文字

import cv2 import numpy as np # creat a black image img = np.zeros((512,512,3), np.uint8) # draw a

OpenCV影象摳取指定區域平移縮放的影象

#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <iostream> #include <fstream> #include <

OpenCV影象處理】十五影象空域濾波(

1.空域濾波介紹 空域濾波是一種鄰域處理方法,通過直接在影象空間中對鄰域內畫素進行處理,達到平滑或銳化影象的作用。此外,在影象識別中,通過濾波還可以抽出影象的特徵作為影象識別的特徵模式。 空域濾波是影象處理領域中廣泛使用的主要工具。空域濾波主要可以分為線性濾波和非線性濾波,

Java 矩形橢圓字串

<span style="font-size:18px;">import java.awt.Color; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import

MFC畫圖(矩形刷畫筆的使用)

繪製任意線條: 1、建立基於單文件工程:Draw CDrawView類中新增成員變數: CPoint m_ptOrigin; BOOL m_bDraw; 2、CDrawView()中初始化: m_ptOrigin = point; m_bDraw = false; 3、新增

python+opencv選出視頻中一幀再利用鼠標回調實現圖像矩形

open cap 圖像 ide http 這樣的 vedio lease 等待   最近因為要實現模板匹配,需要在視頻中選中一個目標,然後框出(即作為模板),對其利用模板匹配的方法進行檢測。於是需要首先選出視頻中的一幀,但是在利用攝像頭讀視頻的過程中我唯一能想到的方法就是:

OpenCv】 如何把圖片的矩形多邊形區域內容置零

#include <iostream> #include <opencv2/opencv.hpp> #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" using namesp