Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

วิธีอ่านค่าพิกเซลเฉพาะจุดใน OpenCV ด้วย C++

บทนำ

ในการอ่านค่าพิกเซลเฉพาะจุดใน 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 ช่องสีพร้อมกัน
  • เหมาะสำหรับการเข้าถึงพิกเซลหลายจุดติดต่อกัน

ผลลัพธ์

วิธีอ่านค่าพิกเซลเฉพาะจุดใน OpenCV ด้วย C++

วิธีอ่านค่าพิกเซลเฉพาะจุดใน OpenCV ด้วย C++

สรุป

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