Chúng ta có thể vẽ các hình dạng khác nhau trên một hình ảnh như hình tròn, hình chữ nhật, hình eclip, đường đa giác, hình lồi, … Nó được sử dụng khi chúng ta muốn đánh dấu bất kỳ đối tượng nào trong hình ảnh đầu vào. OpenCV cung cấp các chức năng cho mỗi hình dạng. Sau đây chúng ta sẽ tìm hiểu về các hàm vẽ.
Các bài viết liên quan:
Vẽ hình tròn
Hàm cv::polylines
trong OpenCV được sử dụng để vẽ đường nét liền (polyline) trên hình ảnh. Dưới đây là thông số của hàm cv::polylines
:
void cv::polylines(cv::InputOutputArray img, const cv::Point* pts, const int* npts, int ncontours, bool isClosed, const cv::Scalar& color, int thickness = 1, int lineType = cv::LINE_8, int shift = 0)
img
: Đối tượngInputOutputArray
đại diện cho hình ảnh đầu vào và đầu ra.pts
: Mảng các điểmcv::Point
tạo thành các đường polyline.npts
: Mảng các số nguyên chỉ định số điểm trong mỗi contour.ncontours
: Số lượng contour.isClosed
: Cờ xác định xem các contour có đóng hay không. Nếutrue
, đường polyline sẽ được đóng lại tạo thành một đa giác.color
: Màu sắc của đường polyline.thickness
: Độ dày của đường polyline. Giá trị mặc định là 1.lineType
: Kiểu đường vẽ. Giá trị mặc định làcv::LINE_8
.shift
: Số bit dịch để tính toán giá trị pixel. Giá trị mặc định là 0.
Ví dụ:
#include <opencv2/opencv.hpp> int main() { // Tạo một hình ảnh trắng có kích thước 400x400 pixel cv::Mat image(400, 400, CV_8UC3, cv::Scalar(255, 255, 255)); // Tâm và bán kính của hình tròn cv::Point center(200, 200); int radius = 100; // Màu sắc và độ dày đường viền của hình tròn cv::Scalar color(0, 0, 255); // Đỏ int thickness = 2; // Vẽ hình tròn trên hình ảnh cv::circle(image, center, radius, color, thickness); // Hiển thị hình ảnh cv::imshow("Circle", image); cv::waitKey(0); return 0; }
Trong ví dụ trên, chúng ta sử dụng hàm circle
để vẽ một hình tròn đỏ có tâm ở điểm (200, 200) và bán kính là 100 trên một hình ảnh trắng. Kết quả sẽ hiển thị một cửa sổ mới với hình ảnh chứa hình tròn.
Lưu ý rằng để sử dụng được OpenCV, bạn cần cài đặt và liên kết thư viện OpenCV với dự án của mình.
Xem thêm numpy.meshgrid() trong Python
Vẽ hình chữ nhật
Hàm cv::rectangle
trong OpenCV được sử dụng để vẽ hình chữ nhật trên hình ảnh. Dưới đây là thông số của hàm cv::rectangle
:
void cv::rectangle(cv::InputOutputArray img, cv::Point pt1, cv::Point pt2, const cv::Scalar& color, int thickness = 1, int lineType = cv::LINE_8, int shift = 0)
img
: Đối tượngInputOutputArray
đại diện cho hình ảnh đầu vào và đầu ra.pt1
: Điểmcv::Point
xác định tọa độ góc trái trên của hình chữ nhật.pt2
: Điểmcv::Point
xác định tọa độ góc phải dưới của hình chữ nhật.color
: Màu sắc của hình chữ nhật.thickness
: Độ dày của đường vẽ. Giá trị mặc định là 1.lineType
: Kiểu đường vẽ. Giá trị mặc định làcv::LINE_8
.shift
: Số bit dịch để tính toán giá trị pixel. Giá trị mặc định là 0.
Hãy xem xét ví dụ sau:
Để vẽ hình chữ nhật trong OpenCV, bạn có thể sử dụng hàm rectangle
có sẵn trong thư viện. Hàm rectangle
cho phép bạn chỉ định tọa độ góc trái trên và góc phải dưới của hình chữ nhật cùng với các thông số khác như màu sắc, độ dày đường viền, vv. Dưới đây là cách sử dụng hàm rectangle
để vẽ hình chữ nhật trong OpenCV:
#include <opencv2/opencv.hpp> int main() { // Tạo một hình ảnh trắng có kích thước 400x400 pixel cv::Mat image(400, 400, CV_8UC3, cv::Scalar(255, 255, 255)); // Tọa độ góc trái trên và góc phải dưới của hình chữ nhật cv::Point topLeft(100, 100); cv::Point bottomRight(300, 300); // Màu sắc và độ dày đường viền của hình chữ nhật cv::Scalar color(0, 0, 255); // Đỏ int thickness = 2; // Vẽ hình chữ nhật trên hình ảnh cv::rectangle(image, topLeft, bottomRight, color, thickness); // Hiển thị hình ảnh cv::imshow("Rectangle", image); cv::waitKey(0); return 0; }
Trong ví dụ trên, chúng ta sử dụng hàm rectangle
để vẽ một hình chữ nhật đỏ có góc trái trên ở điểm (100, 100) và góc phải dưới ở điểm (300, 300) trên một hình ảnh trắng. Kết quả sẽ hiển thị một cửa sổ mới với hình ảnh chứa hình chữ nhật.
Lưu ý rằng để sử dụng được OpenCV, bạn cần cài đặt và liên kết thư viện OpenCV với dự án của mình.
Xem thêm Hàm khởi tạo(constructor) là gì?
Vẽ hình eclip
Hàm cv::ellipse
trong OpenCV có các tham số như sau:
void cv::ellipse( cv::InputOutputArray img, // Hình ảnh đích để vẽ ellipse cv::Point center, // Tọa độ tâm của ellipse cv::Size axes, // Kích thước trục chính và trục phụ của ellipse double angle, // Góc xoay của ellipse (đơn vị: độ) double startAngle, // Góc bắt đầu của ellipse (đơn vị: độ) double endAngle, // Góc kết thúc của ellipse (đơn vị: độ) const cv::Scalar& color, // Màu sắc của ellipse int thickness = 1, // Độ dày đường viền của ellipse (mặc định: 1) int lineType = cv::LINE_8, // Loại đường viền (mặc định: cv::LINE_8) int shift = 0 // Số bit dịch của tọa độ (mặc định: 0) );
Các tham số chi tiết:
img
: Hình ảnh đích để vẽ ellipse.center
: Tọa độ tâm của ellipse (cv::Point).axes
: Kích thước trục chính và trục phụ của ellipse (cv::Size).angle
: Góc xoay của ellipse (đơn vị: độ).startAngle
: Góc bắt đầu của ellipse (đơn vị: độ).endAngle
: Góc kết thúc của ellipse (đơn vị: độ).color
: Màu sắc của ellipse (cv::Scalar).thickness
: Độ dày đường viền của ellipse (mặc định: 1).lineType
: Loại đường viền (mặc định: cv::LINE_8).shift
: Số bit dịch của tọa độ (mặc định: 0).
Lưu ý rằng tham số startAngle
và endAngle
định nghĩa khoảng góc của ellipse được vẽ. Trong trường hợp startAngle = 0
và endAngle = 360
, toàn bộ ellipse sẽ được vẽ.
Bên cạnh các tham số trên, hàm cv::ellipse
cũng hỗ trợ việc thiết lập các thuộc tính khác của đường viền như độ mờ (cv::blur
), mũi tên (cv::arrowedLine
), vv. để tùy chỉnh nét vẽ ellipse.
Hãy xem xét ví dụ sau:
Để vẽ hình ellipse trong OpenCV, bạn có thể sử dụng hàm ellipse
có sẵn trong thư viện. Hàm ellipse
cho phép bạn chỉ định tọa độ tâm, kích thước trục chính và trục phụ, góc xoay, vv. của hình ellipse cùng với các thông số khác như màu sắc, độ dày đường viền, vv.
Dưới đây là cách sử dụng hàm ellipse
để vẽ hình ellipse trong OpenCV:
#include <opencv2/opencv.hpp> int main() { // Tạo một hình ảnh trắng có kích thước 400x400 pixel cv::Mat image(400, 400, CV_8UC3, cv::Scalar(255, 255, 255)); // Tọa độ tâm của ellipse cv::Point center(200, 200); // Kích thước trục chính và trục phụ của ellipse cv::Size axes(100, 50); // Góc xoay của ellipse (đơn vị: độ) double angle = 30; // Góc bắt đầu và kết thúc của ellipse (đơn vị: độ) double startAngle = 0; double endAngle = 360; // Màu sắc và độ dày đường viền của ellipse cv::Scalar color(0, 0, 255); // Đỏ int thickness = 2; // Vẽ ellipse trên hình ảnh cv::ellipse(image, center, axes, angle, startAngle, endAngle, color, thickness); // Hiển thị hình ảnh cv::imshow("Ellipse", image); cv::waitKey(0); return 0; }
Trong ví dụ trên, chúng ta sử dụng hàm ellipse
để vẽ một hình ellipse đỏ có tâm ở điểm (200, 200), kích thước trục chính là 100 và trục phụ là 50, góc xoay là 30 độ trên một hình ảnh trắng. Kết quả sẽ hiển thị một cửa sổ mới với hình ảnh chứa hình ellipse.
Lưu ý rằng để sử dụng được OpenCV, bạn cần cài đặt và liên kết thư viện OpenCV với dự án của mình.
Xem thêm Round trong Python
Vẽ đường line
Hàm cv::line
trong OpenCV có các tham số như sau:
void cv::line( cv::InputOutputArray img, // Hình ảnh đích để vẽ đường cv::Point pt1, // Tọa độ điểm đầu của đường (đỉnh) cv::Point pt2, // Tọa độ điểm cuối của đường (đỉnh) const cv::Scalar& color, // Màu sắc của đường int thickness = 1, // Độ dày đường (mặc định: 1) int lineType = cv::LINE_8, // Loại đường (mặc định: cv::LINE_8) int shift = 0 // Số bit dịch của tọa độ (mặc định: 0) );
Các tham số chi tiết:
img
: Hình ảnh đích để vẽ đường.pt1
: Tọa độ điểm đầu của đường (đỉnh) (cv::Point).pt2
: Tọa độ điểm cuối của đường (đỉnh) (cv::Point).color
: Màu sắc của đường (cv::Scalar).thickness
: Độ dày của đường (mặc định: 1).lineType
: Loại đường (mặc định: cv::LINE_8).shift
: Số bit dịch của tọa độ (mặc định: 0).
Ví dụ về việc sử dụng hàm cv::line
để vẽ đường trên một hình ảnh:
#include <opencv2/opencv.hpp> int main() { // Tạo một hình ảnh đen cv::Mat image(400, 400, CV_8UC3, cv::Scalar(0, 0, 0)); // Tọa độ điểm đầu và điểm cuối của đường cv::Point pt1(50, 50); cv::Point pt2(350, 350); // Màu sắc đường (màu trắng) cv::Scalar color(255, 255, 255); // Vẽ đường trên hình ảnh cv::line(image, pt1, pt2, color, 2); // Hiển thị hình ảnh cv::imshow("Line", image); cv::waitKey(0); return 0; }
Trong ví dụ trên, chúng ta tạo một hình ảnh đen và vẽ một đường từ điểm có tọa độ (50, 50) đến điểm có tọa độ (350, 350) bằng màu trắng. Đường có độ dày là 2. Kết quả được hiển thị trong cửa sổ hình ảnh.
Xem thêm Các hình vẽ cơ bản trong AI
Viết văn bản lên hình ảnh
Hàm cv::putText
trong OpenCV có các tham số như sau:
void cv::putText( cv::InputOutputArray img, // Hình ảnh đích để vẽ văn bản const std::string& text, // Chuỗi văn bản cần vẽ cv::Point org, // Tọa độ góc trái trên của văn bản int fontFace, // Font chữ (mô phỏng bởi các hằng số cv::HersheyFonts) double fontScale, // Tỉ lệ font chữ const cv::Scalar& color, // Màu sắc văn bản int thickness = 1, // Độ dày văn bản int lineType = cv::LINE_8, // Loại đường (mặc định: cv::LINE_8) bool bottomLeftOrigin = false // Gốc của hệ tọa độ văn bản (mặc định: false) );
Các tham số chi tiết:
img
: Hình ảnh đích để vẽ văn bản.text
: Chuỗi văn bản cần vẽ.org
: Tọa độ góc trái trên của văn bản (cv::Point).fontFace
: Font chữ (mô phỏng bởi các hằng số cv::HersheyFonts).fontScale
: Tỉ lệ font chữ.color
: Màu sắc văn bản (cv::Scalar).thickness
: Độ dày văn bản (mặc định: 1).lineType
: Loại đường (mặc định: cv::LINE_8).bottomLeftOrigin
: Gốc của hệ tọa độ văn bản (mặc định: false).
Ví dụ về việc sử dụng hàm cv::putText
để vẽ văn bản trên một hình ảnh:
#include <opencv2/opencv.hpp> int main() { // Tạo một hình ảnh trắng cv::Mat image(400, 400, CV_8UC3, cv::Scalar(255, 255, 255)); // Chuỗi văn bản cần vẽ std::string text = "Hello, OpenCV!"; // Tọa độ góc trái trên của văn bản cv::Point org(50, 200); // Font chữ int fontFace = cv::FONT_HERSHEY_SIMPLEX; // Tỉ lệ font chữ double fontScale = 1.5; // Màu sắc văn bản (màu đỏ) cv::Scalar color(0, 0, 255); // Độ dày văn bản int thickness = 2; cv::putText(image, text, org, fontFace, fontScale, color, thickness); // Hiển thị hình ảnh cv::imshow("Image with Text", image); cv::waitKey(0); return 0; }
Trong ví dụ trên, chúng ta tạo một hình ảnh trắng với kích thước 400×400 pixel. Sau đó, chúng ta khai báo các thông số cho việc vẽ văn bản, bao gồm chuỗi văn bản, tọa độ góc trái trên của văn bản, font chữ, tỉ lệ font chữ, màu sắc văn bản và độ dày văn bản. Cuối cùng, chúng ta sử dụng hàm cv::putText
để vẽ văn bản lên hình ảnh và hiển thị hình ảnh kết quả.
Lưu ý rằng để biên dịch và chạy thành công ví dụ trên, bạn cần có thư viện OpenCV được cài đặt và liên kết trong dự án của mình.
Xem thêm Cài đặt OpenCV
Vẽ Polylines
Hàm cv::polylines
trong OpenCV được sử dụng để vẽ đường nét liền (polyline) trên hình ảnh. Dưới đây là thông số của hàm cv::polylines
:
void cv::polylines(cv::InputOutputArray img, const cv::Point* pts, const int* npts, int ncontours, bool isClosed, const cv::Scalar& color, int thickness = 1, int lineType = cv::LINE_8, int shift = 0)
img
: Đối tượngInputOutputArray
đại diện cho hình ảnh đầu vào và đầu ra.pts
: Mảng các điểmcv::Point
tạo thành các đường polyline.npts
: Mảng các số nguyên chỉ định số điểm trong mỗi contour.ncontours
: Số lượng contour.isClosed
: Cờ xác định xem các contour có đóng hay không. Nếutrue
, đường polyline sẽ được đóng lại tạo thành một đa giác.color
: Màu sắc của đường polyline.thickness
: Độ dày của đường polyline. Giá trị mặc định là 1.lineType
: Kiểu đường vẽ. Giá trị mặc định làcv::LINE_8
.shift
: Số bit dịch để tính toán giá trị pixel. Giá trị mặc định là 0.
Dưới đây là một ví dụ sử dụng hàm cv::polylines
để vẽ một đường polyline trên hình ảnh:
#include <opencv2/opencv.hpp> int main() { // Tạo một hình ảnh trắng với kích thước 400x400 pixel cv::Mat image(400, 400, CV_8UC3, cv::Scalar(255, 255, 255)); // Tạo một mảng các điểm để tạo đường polyline cv::Point points[5]; points[0] = cv::Point(50, 50); points[1] = cv::Point(100, 150); points[2] = cv::Point(200, 200); points[3] = cv::Point(300, 100); points[4] = cv::Point(250, 50); // Số điểm trong mỗi contour int npts[] = {5}; // Vẽ đường polyline màu đỏ với độ dày 2 cv::polylines(image, &points[0], npts, 1, false, cv::Scalar(0, 0, 255), 2); // Hiển thị hình ảnh cv::imshow("Image with Polyline", image); cv::waitKey(0); return 0; }
Trong ví dụ trên, chúng ta tạo một hình ảnh trắng với kích thước 400×400 pixel.
Xem thêm Cách thực thi file jar trong Java