簡體   English   中英

cv ::中的cv :: Point的OpenCV rgb值

[英]OpenCV rgb value for cv::Point in cv::Mat

我已經在StackOverflow上看到了不同的問題,但似乎沒有任何幫助。 我想要做的很簡單:我有一個cv::Point ,我需要在cv::Mat獲得該點像素的RGB值,以便我可以將它與存儲的RGB值進行比較。

現在這應該很容易,但我嘗試了1001種不同的方式,它對我來說不起作用。

有人請幫助我擺脫痛苦!

編輯:以下兩個答案都有效! 我是C ++的新手,並不知道通過cout輸出一個unsigned char給出了一個問號! printf offcourse給出了正確的價值!

這真的很容易。 然而,OpenCV的文檔擅長隱藏簡單的答案。

這是示例代碼:

cv::Mat3b image = imread(filename);
cv::Point point(23, 42);
cv::Vec3b template;
template[0] = 128; template[1] = 12; template[2] = 64;

const cv::Vec3b& bgr = image(point);
if (bgr[0] == template[0] && bgr[1] == template[1] && bgr[2] == template[2])
   std::cout << "Colors match!" << std::endl;

有可能更好的方法來處理cv :: Vec,但我忘記了。 另請參見OpenCV備忘單

這取決於圖像/ Mat的類型。 如果圖像對於每個像素的每個rgb只是正常的1個字節,則這是訪問它的一種方式。 它非常有效,但不是最安全的方式:

// The RGB values are stored in reverse order (i don't know why)
struct RGB { unsigned char b, g, r; };

// Assumes 1 byte for r,g,b
RGB& GetRGB(cv::Mat &mat, cv::Point p)
{
  assert((mat.step/mat.cols) == sizeof(RGB));
  RGB *data = (RGB*)mat.data;
  data += p.y * mat.cols + p.x;
  return *data;
}

如果Mat的類型不同,那么您只需要更改RGB的結構以匹配您需要的結構。

嘗試使用以下代碼將您讀入的圖像類型更改為普通RGB圖像:

Mat in, out;
cvtColor(in, out, CV_8UC3);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM