[英]OpenCV std::vector< cv::Point2f > to cv::Mat
[英]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.