การวาดรูปทรง และ ข้อความ OpenCV
บทความจะพูดถึงเรื่อง ฟังก์ชัน การวาดรูปทรง (Drawing) และ ข้อความ (Text) ใน OpenCV กับ C++ โดยฟังก์ชัน Drawing เป็นคำสั่งสำหรับใช้วาดรูปทรง ใน OpenCV
ขั้นตอนการทํางาน
# การปรับขนาดรูปภาพ และการครอบตัดรูปภาพ
โดยศึกษา ขั้นตอนการทำงาน จากลิงค์บทความ ด้านล่าง
1 : OpenCV วาดภาพพื้นสีต่างๆ
CV_8UC3 เป็นรูปภาพเมทริกซ์ 8 บิต ประเภท Scalar ใช้กันอย่างแพร่หลายใน OpenCV สำหรับการส่งค่าพิกเซล ในบทช่วยสอนนี้ เราจะใช้ตัวอย่างเพื่อแสดงค่าสี BGR (พารามิเตอร์ 3 ตัว) และ อาร์กิวเมนต์สี โดยให้: สเกลาร์ Scalar(a, b, c) เราจะกำหนดสี BGR เช่น: สีน้ําเงิน (Blue) = a, สีเขียว (Green) = b และ สีแดง (Red) = c
ตัวแปร อินสแตนซ์ (instance) ชื่อ img สร้างจากคลาส Mat หรือ เมทริกซ์ เป็นคลาสใน OpenCV Library สืบทอดมาจาก เนมสเปซ cv
512,512 คือขนาดรูปภาพหน่วยเป็นพิกเซล CV_8UC3 เป็นชนิดรูปภาพเมทริกซ์ 8 บิต (0-225) และ Scalar(255,0,0) คือให้แสดง สีน้ำเงิน
Mat img(512,512,CV_8UC3, Scalar(255,0,0));
เขียนโค้ดดังนี้
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
Mat img(512,512,CV_8UC3, Scalar(255,0,0));
imshow("Image", img);
waitKey(0);
return 0;
}
วาดรูปภาพสีน้ำเงิน ขนาด 512 x 512 พิกเซล
และเมื่อทดสอบแก้ไขค่าของ สเกลาร์ เป็น Scalar(255,0,255)
Mat img(512,512,CV_8UC3, Scalar(255,0,255));
วาดรูปภาพสีม่วง ขนาด 512 x 512 พิกเซล
และเมื่อทดสอบแก้ไขค่าของ สเกลาร์ เป็น Scalar(255,255,255)
Mat img(512,512,CV_8UC3, Scalar(255,255,255));
วาดรูปภาพสีขาว ขนาด 512 x 512 พิกเซล
2 : OpenCV วาดรูปวงกลม
ในการวาดวงกลม คุณต้องมีพิกัดศูนย์กลางและรัศมีของวงกลมนั้น เราจะวาดวงกลมภายในสี่เหลี่ยม ภาพพื้นสีขาว ด้านบน
@คำสั่งที่เพิ่มเข้ามา
ใช้คำสั่ง circle จาก OpenCV Library สร้างอ็อบเจกต์ วงกลม
โดยให้แสดงอยู่ที่พิกัดศูนย์กลางของรูปภาพ หาได้โดย นำขนาดรูปภาพที่เราสร้างมาก่อนหน้านี้คือ 512 มา หาร 2 ก็จะได้ พิกัดศูนย์กลาง ของรูปภาพ คือ Point(256,256)
กำหนดขนาด รัศมีของวงกลม = 155
กำหนดสีของขอบวงกลม = Scalar(0, 69, 255))
circle(img,Point(256,256),155, Scalar(0, 69, 255));
เขียนโค้ดดังนี้
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
Mat img(512,512,CV_8UC3, Scalar(255,255,255));
circle(img,Point(256,256),155, Scalar(0, 69, 255));
imshow("Image", img);
waitKey(0);
return 0;
}
วาด ขอบ ของรูปภาพวงกลม
เพิ่ม ความหนา ขอบ ของรูปภาพวงกลม เช่น ให้มีค่าเป็น 10
circle(img,Point(256,256),155, Scalar(0, 69, 255),10);
วาด ขอบ ของรูปภาพ วงกลม ด้วยความหนา ที่ใหญ่ขึ้น
ให้รูปภาพวงกลม แสดงสีเต็มวงกลม ด้วยคำสั่ง FILLED
circle(img,Point(256,256),155, Scalar(0, 69, 255),FILLED);
แสดง รูปภาพวงกลม ที่มีสีเต็มวงกลม
3 : OpenCV วาดรูปสี่เหลี่ยมผืนผ้า
ในการวาดรูปสี่เหลี่ยมผืนผ้า คุณต้องมีมุมบนซ้ายและมุมล่างขวาของสี่เหลี่ยม คราวนี้เราจะวาดรูปสี่เหลี่ยมผืนผ้าสีขาวที่มุมบนขวาของภาพ
@คำสั่งที่เพิ่มเข้ามา
ใช้คำสั่ง rectangle จาก OpenCV Library สร้างอ็อบเจกต์ สี่เหลี่ยมผืนผ้า
ระบุตำแหน่งที่แสดง คือ 1. มุมบนซ้าย Point(x1, y1) และ 2. มุมล่างขวา Point(x2, y2)
กำหนดสีของขอบวงกลม เป็นสีขาว Scalar(255, 255, 255)
ขนาด ของเส้นขอบ ของรูปสี่เหลี่ยมผืนผ้า คือ 3
rectangle(img, Point(x1, y1), Point(x2, y2), Scalar(255, 255, 255),3);
จากภาพตัวอย่างด้านบนใส่ค่าเป็นตัวเลขได้ดังนี้
rectangle(img, Point(100, 200), Point(400, 300), Scalar(255, 255, 255),3);
เขียนโค้ดดังนี้
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
Mat img(512,512,CV_8UC3, Scalar(255,255,255));
circle(img,Point(256,256),155, Scalar(0, 69, 255),FILLED);
rectangle(img, Point(120, 200), Point(390, 300), Scalar(255, 255, 255),3);
imshow("Image", img);
waitKey(0);
return 0;
}
วาด ขอบรูปสี่เหลี่ยมผืนผ้า
ให้รูปสี่เหลี่ยมผืนผ้า แสดงสีขาวเต็มสี่เหลี่ยมผืนผ้า ด้วยคำสั่ง FILLED
rectangle(img, Point(120, 200), Point(390, 300), Scalar(255, 255, 255),FILLED);
วาด สีขาวเต็มสี่เหลี่ยมผืนผ้า
4 : OpenCV วาดเส้น
ในการวาดเส้น คุณต้องผ่านพิกัดเริ่มต้นและสิ้นสุดของเส้น
@คำสั่งที่เพิ่มเข้ามา
ใช้คำสั่ง line จาก OpenCV Library สร้างอ็อบเจกต์ เส้น
ระบุตำแหน่งที่แสดง คือ 1. จุดพิกัดเริ่มต้น Point(x1, y1) และ 2. จุดสิ้นสุดของเส้น Point(x2, y2)
กำหนดสีของเส้น เป็นสีขาว Scalar(255, 255, 255)
ความหนา ของเส้น คือ 2
line(img, Point(x1, y1), Point(x2, y2), Scalar(255, 255, 255), 2);
ใส่ค่าเป็นตัวเลขได้ดังนี้
line(img, Point(120, 310), Point(390, 310), Scalar(255, 255, 255), 2);
เขียนโค้ดดังนี้
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
Mat img(512,512,CV_8UC3, Scalar(255,255,255));
circle(img,Point(256,256),155, Scalar(0, 69, 255),FILLED);
rectangle(img, Point(120, 200), Point(390, 300), Scalar(255, 255, 255),FILLED);
line(img, Point(120, 310), Point(390, 310), Scalar(255, 255, 255), 2);
imshow("Image", img);
waitKey(0);
return 0;
}
วาดเส้น
5 : OpenCV เขียนข้อความ
การเพิ่มข้อความลงในรูปภาพ:
หากต้องการใส่ข้อความในภาพ คุณต้องระบุสิ่งต่อไปนี้
- ข้อมูลข้อความที่คุณต้องการเขียน
- พิกัดตำแหน่งที่คุณต้องการวางไว้ (เช่น มุมล่างซ้ายที่ข้อมูลเริ่มต้น)
- ประเภทฟอนต์
- Font Scale (กำหนดขนาดของฟอนต์)
- สิ่งปกติ เช่น สี ความหนา lineType เป็นต้น เพื่อให้ดูดีขึ้น
@คำสั่งที่เพิ่มเข้ามา
ใช้คำสั่ง putText จาก OpenCV Library สร้างอ็อบเจกต์ ข้อความ
ข้อมูลข้อความที่คุณต้องการเขียน เช่น LungMaker Workshop
ระบุตำแหน่งที่แสดง คือ พิกัดตำแหน่ง Point(x1, y1)
ประเภทของฟอนต์ ในตัวอย่างเลือกเป็น FONT_HERSHEY_DUPLEX
Font Scale (กำหนดขนาดของฟอนต์) แบบอัตราส่วน เป็น 0.75
กำหนดสีของเส้น เป็นสีส้ม Scalar(0, 69, 255),
ความหนา คือ 2
putText(img, "LungMaker Workshop", Point(130,262),FONT_HERSHEY_DUPLEX,0.75, Scalar(0, 69, 255),2);
เขียนโค้ดดังนี้
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
Mat img(512,512,CV_8UC3, Scalar(255,255,255));
circle(img,Point(256,256),155, Scalar(0, 69, 255),FILLED);
rectangle(img, Point(120, 200), Point(390, 300), Scalar(255, 255, 255),FILLED);
line(img, Point(120, 310), Point(390, 310), Scalar(255, 255, 255), 2);
putText(img, "LungMaker Workshop", Point(130,262),FONT_HERSHEY_DUPLEX,0.75, Scalar(0, 69, 255),2);
imshow("Image", img);
waitKey(0);
return 0;
}
แสดงข้อความลงในรูปภาพ