การวาดรูปทรง และ ข้อความ 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;
}


แสดงข้อความลงในรูปภาพ