访问检测到的对象/c++内部的像素值
access pixel values inside the detected object / c++
如果我可以通过使用canny边缘检测器来检测圆,我如何访问圆内的所有值?
void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false )
这个函数的输出会给我边缘检测器检测到的边缘值,但我想要的是圆内的所有值。
提前感谢
------编辑后。。。。。。。
Mat mask = Mat::zeros(canny_edge.rows, canny_edge.cols, CV_8UC1);
Mat crop(main.rows, main.cols, CV_32FC1);
main.copyTo( crop, mask );
for(unsigned int y=0; y< height; y++)
for(unsigned int x=0; x< width; x++)
if(mask.at<unsigned char>(y,x) > 0)
{
}
对于圆形,如原始问题中所问:
首先要检测圆(例如,使用hough圆检测方法)。如果你已经这样做了,你就有了某种圆心和半径。看看http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html
之后,你必须测试一个像素是否在圆圈内。因此,一个想法(使用openCV非常快)是在遮罩图像上绘制一个实心圆,并测试原始图像中的每个像素,是否设置了相同图像坐标的遮罩像素(然后像素在对象内部)。这适用于任何其他可绘制对象,在遮罩上绘制(填充)对象并测试遮罩值。
假设你有一个圆圈center
和一个radius
,并且你的原始图像的大小是image_height x image_width,那么试试这个:
cv::Mat mask = cv::Mat::zeros(image_height,image_width, CV_8U);
cv::circle(mask, center, radius, cv::Scalar(255), -1);
for(unsigned int y=0; y<image_height; ++y)
for(unsigned int x=0; x<image_width; ++x)
if(mask.at<unsigned char>(y,x) > 0)
{
//pixel (x,y) in original image is within that circle so do whatever you want.
}
不过,如果限制遮罩区域(两个维度中的圆心+/-半径)而不是在整个图像上循环,则效率会更高;)
对于圆,应该使用霍夫圆变换。从中可以得到图像中的圆心和半径。如果给定像素与圆心的距离小于圆的半径,则该像素位于特定圆内。
对于一般形状,使用findCountours获取形状的轮廓,然后可以使用pointPolygonTest来确定该形状内的点。有一个tutorialon。
相关文章:
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何在24位SDL_Surface上设置像素的颜色
- 如何从SDL_Surface获取特定像素的颜色
- 如何将CMSampleBufferRef/CIImage/UIImage转换为像素,例如uint8_t[]
- 在C++中查找像素 RGB 数据的最快方法是什么?
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 如何使用 sdl2 快速绘制像素网格?
- 如何在C++中进行像素操作? - Linux
- 他们如何将红外锁定像素转换为镜头前方 1m 的正常平面上的位置
- 访问随机图像像素的快速方法,最多一次
- OpenCV 像素访问点与 at() - 不同的值
- 如何使用 freetype2 访问单色位图中的像素状态
- 尝试渲染像素坐标时,简单线条渲染失败
- 计算另一个图像像素满足条件的像素值的平均值
- 如何返回定义良好的内存部分?例如来自图像数据的像素的颜色值
- 在Qt-cpp中通过像素获取QString的子字符串
- 访问检测到的对象/c++内部的像素值
- c++opengGL:绘制多边形+图像处理内部像素