- 從零開始:數字圖像處理的編程基礎與應用
- 彭凌西 彭紹湖 唐春明 陳統編著
- 1877字
- 2022-04-13 16:24:02
1.6 圖像屬性與基本圖形繪制
本節將介紹圖像的屬性定義和表示方法,以及如何繪制基本圖形(如直線、矩形和圓形)。
· 1.6.1 圖像屬性
█ 1. 畫點 cv::Point()
OpenCV中使用cv::Point()表示其圖像坐標和指定的2D點。cv::Point()類的對象創建有兩種方式:第一種是使用構造函數,第二種是使用成員變量賦值。具體示例如下。
Point pt = Point(x,y) // 第一種方式:使用構造函數
Point pt; // 第二種方式:使用成員變量賦值
Pt.x = 10;
Pt.y = 8;
█ 2. 定義顏色 cv::Scalar()
OpenCV中使用cv::Scalar()類來表示一個4元素的向量。其定義如下。
Scalar scalar(
double val[4];
)
Scalar類型被廣泛應用于OpenCV中,常用于傳遞像素值,也常用于表示BGR顏色值(3個參數)。如果不使用最后一個參數,則無須定義最后一個參數。
當要定義一個顏色參數時,可以通過Scalar( a, b, c )來表示。例如,當要定義一個RGB顏色時,可以使Blue = a、Green = b、Red = c。
█ 3. 設置尺寸 cv::Size()
OpenCV中圖像的大小可以通過cv::Size類來表示,第一個參數width表示圖像的寬度,第二個參數height表示圖像的高度,其定義如下。
cv::Size(
int _width,
int _height
)
這里介紹的是Size類的簡單使用方法,即可以通過“Size size(5, 10);”語句創建對象,通過size.width和size.height訪問對象數據成員。
· 1.6.2 基本圖形繪制
█ 1.繪制直線
cv::line()函數用于在圖像中繪制連接點pt1和點pt2的直線。cv::line()函數定義如下。
void cv::line(
inputOutputArray img,//圖像
Point pt1,//點1
Point pt2,//點2
const Scalar & color,//繪制直線的顏色
int thickness = 1,//直線的厚度
int lineType = LINE_8,//直線的類型
int shief = 0 //點坐標中的小數位數
)
█ 2.繪制矩形
cv::rectangle()函數用于繪制矩形。OpenCV中通過cv::Rect類定義矩形,Rect矩形類包括Point點類的成員x和y(表示矩形的左上角)以及size類的成員width和height(表示矩形的大小)。但是,矩形類不會從Point點類或size類繼承,因此通常不會從它們中繼承操作符。其基本定義和使用方法如表1-3所示。
表1-3 cv::Rect類的定義與使用方法

cv::rectangle()函數定義有以下兩種形式。
形式一:
void rectangle(
cv::Mat& img,// 待繪制的圖像
cv::Point pt1,// 矩形的第一個頂點
cv::Point pt2 // 矩形的對角頂點
const cv::Scalar& color,// 線條的顏色(RGB)
int lineType = 8,// 線型(4鄰域或8鄰域,默認為8鄰域)
int shift = 0 // 偏移量
);
形式二:
void rectangle(
cv::Mat& img,// 待繪制的圖像
cv::Rect r,// 待繪制的矩形
const cv::Scalar& color,// 線條的顏色(RGB)
int lineType = 8,// 線型(4鄰域或8鄰域,默認為8鄰域)
int shift = 0 // 偏移量
);
█ 3.繪制圓形
cv::circle()函數用于繪制圓形。cv::circle()函數定義如下。
void circle(
cv::Mat& img,// 待繪制的圖像
cv::Point center,// 圓心位置
int radius,// 圓的半徑
const cv::Scalar& color,// 線條的顏色(RGB)
int thickness = 1,// 線寬
int lineType = 8,// 線型(4鄰域或8鄰域,默認為8鄰域)
int shift = 0// 偏移量
);
下面將通過例1-6展示如何繪制點、直線、矩形和圓形等基本圖形(同前面一樣,需在1-6.pro文件中導入OpenCV環境配置信息)。
例1-6:基本圖形繪制。
具體代碼如下。
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
int main()
{
// 設置窗口
Mat img = Mat::zeros(Size(800,600),CV_8UC3);
img.setTo(255); // 設置屏幕為白色
Point p1(100,100); // 點p1
Point p2(758,50); // 點p2
// 畫直線函數
line(img, p1, p2, Scalar(0,0,255), 2); // 紅色
line(img, Point(300,300), Point(758,400), Scalar(0,255,255), 3);
Point p(20,20);//初始化點p的坐標為(20,20)
circle(img,p,1,Scalar(0,255,0),-1); // 畫半徑為1的圓形(畫點)
Point p4;
p4.x = 300;
p4.y = 300;
circle(img, p4, 100, Scalar(120,120,120), -1);
int thickness = 3;
int lineType = 8;
double angle = 30; //橢圓旋轉角度
ellipse(img, Point(100,100), Size(90,60),angle,0,360, Scalar(255,255,0),thickness,lineType);
// 畫矩形
Rect r(250,250,120,200);
rectangle(img,r,Scalar(0,255,255),3);
imshow(“pic”,img);
waitKey();
return 0;
}
程序運行結果如圖1-53所示。

圖1-53 例1-6程序運行結果
· 1.6.3 顏色空間轉換
我們在生活中看到的彩色圖像大多數是RGB類型的,但是在進行圖像處理時,需要用到灰度、二值、HSV、HSI等顏色空間(又稱顏色模式)。OpenCV中提供了cvtColor()函數來實現這些空間之間的相互轉換。cvtColor()函數定義如下。
void cvtColor(InputArray src, OutputArray dst, int code[,int dstCn=0]);
該函數的參數解析如下。
- InputArray src:輸入圖像,即要進行顏色空間轉換的源圖像,可以是Mat類。
- OutputArray dst:輸出圖像,即進行顏色空間轉換后的圖像,也可以是Mat類。
- int code: 轉換的代碼或標識,即在此確定將什么模式的圖像轉換成什么模式的圖像,后面會詳細介紹。
- int dstCn: 目標圖像通道數,如果取值為0,則由src和code決定。
該函數的作用是將圖像從一個顏色空間轉換到另一個顏色空間。應注意的是,從RGB顏色空間向其他顏色空間轉換時,必須明確指出圖像的顏色通道。前面提到過,在OpenCV中,默認的顏色排列是BGR而非RGB。所以對于24位顏色圖像來說,前8位是藍色,中間8位是綠色,最后8位是紅色。常見的RGB通道的取值范圍如下。
- 0~255:CV_8U類型圖像。
- 0~65535:CV_16U類型圖像。
- 0~1: CV_32F類型圖像。
對于線性變換來說,這些取值范圍是無關緊要的。但是對于非線性變換,輸入的RGB圖像必須歸一化到其對應的取值范圍來獲得最終正確的轉換結果,例如RGB→CIE L*u*v*轉換。如果有一個32位浮點圖像直接從8位圖像轉換而不進行任何縮放,那么它將具有0~255的值范圍而不是該函數假定的0~1。所以,在調用cvtColor()函數之前,需要先將圖像縮小。
img * = 1./255;
cvtColor(img,img,COLOR_BGR2Luv);
cvtColor()函數中的轉換代碼(code)如表1-4所示。
表1-4 轉換代碼(code)表

下面通過例1-7演示cvtColor()函數的使用方法。
例1-7: cvtColor()函數的使用方法。
具體代碼如下。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
Mat src,dst,dst1;
src = imread("D:/images/touxiang.jpg");
//判斷圖像是否載入成功
if (src.empty())
{
cout<< "can not open the image"<<endl;
return -1;
}
imshow("touxiang.jpg",src);
cvtColor(src,dst,COLOR_BGR2GRAY);//轉換方式1,轉換為灰度圖,經常使用,需要記住
cvtColor(src,dst1,COLOR_BGR2Lab);//轉換方式2
imshow("CV_BGR2GRAY change",dst);
imshow("COLOR_BGR2Lab change",dst1);
waitKey(0);
return 0;
}
程序運行結果如圖1-54所示。

圖1-54 例1-7程序運行結果
- 程序員面試白皮書
- Python自動化運維快速入門(第2版)
- Manga Studio Ex 5 Cookbook
- Learning SQLite for iOS
- 利用Python進行數據分析(原書第3版)
- C語言程序設計教程
- Visual C++開發入行真功夫
- Mastering Git
- Hands-On Nuxt.js Web Development
- 零基礎C#學習筆記
- 大學計算機應用基礎(Windows 7+Office 2010)(IC3)
- Swift High Performance
- Learn Linux Quickly
- Learning Dynamics NAV Patterns
- 區塊鏈原理、架構與應用(第2版)