บทนำ
ในการอ่านค่าพิกเซลเฉพาะจุดใน OpenCV มี 2 วิธีหลักคือ วิธี at และวิธี Direct Access บทความนี้จะอธิบายทั้งสองวิธีพร้อมตัวอย่างโค้ด
วิธีที่ 1: ใช้เมธอด at
วิธีนี้ต้องระบุชนิดข้อมูลของภาพ (เช่น Vec3b สำหรับภาพ RGB) เมื่อเข้าถึงพิกเซล
ตัวอย่างโค้ด
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main() {
Mat image;
image = imread("sky.jpg");
// อ่านค่าพิกเซลที่ตำแหน่ง (10, 29)
int x = image.at<Vec3b>(10, 29)[0]; // Blue channel
int y = image.at<Vec3b>(10, 29)[1]; // Green channel
int z = image.at<Vec3b>(10, 29)[2]; // Red channel
cout << "ค่าช่องสีน้ำเงิน: " << x << endl;
cout << "ค่าช่องสีเขียว: " << y << endl;
cout << "ค่าช่องสีแดง: " << z << endl;
system("pause");
return 0;
}
อธิบาย
image.at<Vec3b>(row, col): เข้าถึงพิกเซลที่แถว row คอลัมน์ col[0],[1],[2]: ดัชนีของช่องสี B, G, ตามลำดับ (OpenCV ใช้ลำดับ BGR)- ค่าที่ได้จะเป็น integer ในช่วง 0-255
วิธีที่ 2: ใช้ Direct Access Method
วิธีนี้ง่ายกว่า เพราะไม่ต้องระบุชนิดข้อมูลทุกครั้งที่เข้าถึง แต่ต้องประกาศชนิดของ Mat ตั้งแต่ต้น เช่น Mat_<Vec3b>
ตัวอย่างโค้ด
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main() {
Mat_<Vec3b> image;
image = imread("sky.jpg");
// เข้าถึงพิกเซลโดยตรงด้วย syntax image(row, col)
Vec3b pixel = image(10, 29);
cout << "ค่าพิกเซล (B,G,R): " << pixel << endl;
system("pause");
return 0;
}
ข้อดีของ Direct Access
- Syntax สั้นกว่าและอ่านง่ายกว่า
- คืนค่าเป็น Vec3b ทั้ง 3 ช่องสีพร้อมกัน
- เหมาะสำหรับการเข้าถึงพิกเซลหลายจุดติดต่อกัน
ผลลัพธ์


สรุป
ทั้งสองวิธีให้ผลลัพธ์เหมือนกัน แต่ at มีการตรวจสอบขอบเขตอัตโนมัติ (ปลอดภัยกว่า) ส่วน Direct Access เร็วกว่าและสะดวกกว่า เลือกใช้ตามความเหมาะสมของงาน