在openCV中访问某个像素的RGB值
我已经search了互联网和计算器彻底,但我还没有find答案我的问题:
我如何获得/设置OpenCV中某些(由x,y坐标给定的)像素的RGB值? 什么是重要的 – 我用C ++编写,图像存储在cv :: Matvariables中。 我知道有一个IplImage()运算符,但是IplImage在使用中并不是很舒服 – 据我所知它来自C API。
是的,我知道在OpenCV 2.2线程中已经有了这个Pixel访问权限 ,但是只有黑白位图。
编辑:
非常感谢您的答复。 我看到有很多方法来获取/设置像素的RGB值。 我从我亲密的朋友那里得到了一个更多的想法,感谢Benny! 这非常简单而有效。 我认为这是一个你select的味道的问题。
Mat image;
(……)
Point3_<uchar>* p = image.ptr<Point3_<uchar> >(y,x);
然后你可以读取/写入RGB值:
p->x //B p->y //G p->z //R
尝试以下操作:
cv::Mat image = ...do some stuff...;
image.at<cv::Vec3b>(y,x);
为您提供cv::Vec3b
types的RGB(可以按照BGR的顺序排列)
image.at<cv::Vec3b>(y,x)[0] = newval[0]; image.at<cv::Vec3b>(y,x)[1] = newval[1]; image.at<cv::Vec3b>(y,x)[2] = newval[2];
低级的方法是直接访问matrix数据。 在一个RGB图像(我相信OpenCV通常存储为BGR),并假设你的cv :: Matvariables被称为frame
,你可以从位置( x
, y
)(从左上angular)获得蓝色值:
frame.data[frame.channels()*(frame.rows*y + x)];
同样,要得到B,G和R:
uchar b = frame.data[frame.channels()*(frame.cols*y + x) + 0]; uchar g = frame.data[frame.channels()*(frame.cols*y + x) + 1]; uchar r = frame.data[frame.channels()*(frame.cols*y + x) + 2];
请注意,此代码假定步幅等于图像的宽度。
对于有这样问题的人来说,一段代码更容易。 我分享我的代码,你可以直接使用它。 请注意,OpenCV将像素存储为BGR。
cv::Mat vImage_; if(src_) { cv::Vec3f vec_; for(int i = 0; i < vHeight_; i++) for(int j = 0; j < vWidth_; j++) { vec_ = cv::Vec3f((*src_)[0]/255.0, (*src_)[1]/255.0, (*src_)[2]/255.0);//Please note that OpenCV store pixels as BGR. vImage_.at<cv::Vec3f>(vHeight_-1-i, j) = vec_; ++src_; } } if(! vImage_.data ) // Check for invalid input printf("failed to read image by OpenCV."); else { cv::namedWindow( windowName_, CV_WINDOW_AUTOSIZE); cv::imshow( windowName_, vImage_); // Show the image. }
当前版本允许cv::Mat::at
函数处理3个维度 。 所以对于一个Mat
对象m
, m.at<uchar>(0,0,0)
应该可以工作。
uchar * value = img2.data; //Pointer to the first pixel data ,it's return array in all values int r = 2; for (size_t i = 0; i < img2.cols* (img2.rows * img2.channels()); i++) { if (r > 2) r = 0; if (r == 0) value[i] = 0; if (r == 1)value[i] = 0; if (r == 2)value[i] = 255; r++;
}
const double pi = boost::math::constants::pi<double>(); cv::Mat distance2ellipse(cv::Mat image, cv::RotatedRect ellipse){ float distance = 2.0f; float angle = ellipse.angle; cv::Point ellipse_center = ellipse.center; float major_axis = ellipse.size.width/2; float minor_axis = ellipse.size.height/2; cv::Point pixel; float a,b,c,d; for(int x = 0; x < image.cols; x++) { for(int y = 0; y < image.rows; y++) { auto u = cos(angle*pi/180)*(x-ellipse_center.x) + sin(angle*pi/180)*(y-ellipse_center.y); auto v = -sin(angle*pi/180)*(x-ellipse_center.x) + cos(angle*pi/180)*(y-ellipse_center.y); distance = (u/major_axis)*(u/major_axis) + (v/minor_axis)*(v/minor_axis); if(distance<=1) { image.at<cv::Vec3b>(y,x)[1] = 255; } } } return image; }