使用LineIterator可以沿一条线访问像素强度值

时间:2017-07-10 21:45:55

标签: c++ ios swift opencv image-processing

我是opencv的新手,所以我想帮助完成我的任务。我使用Swift构建了一个绘图iOS App。用户能够绘制线并返回端点(x,y)中像素位置的数组。用户绘制的画布与用户可以选择的图片大小相同。我希望LineIterator能够沿着由端点数组定义的行访问图像的像素强度值。由于行是分段的,我想每个段都会有一个新的LineIterator。然后,返回包含像素位置和相应强度值的数组,以便可以为这两个值绘制图表。到目前为止,这就是我在OpenCVWrapper.mm中所拥有的

+(NSMutableArray *) getPixelIntensity:(UIImage *)image withEndpoints:(NSMutableArray *) endpoints{

//Transform UIImage to cv::Mat cv::Mat imageMat; UIImageToMat(image, imageMat);

cv::LineIterator(image, endpoints[0], endpoints[1], 8, false); }

我不确定如何构建LineIterator对象并访问像素强度值。谢谢!

1 个答案:

答案 0 :(得分:0)

要使用// grabs pixels along the line (pt1, pt2) // from 8-bit 3-channel image to the buffer LineIterator it(img, pt1, pt2, 8); LineIterator it2 = it; vector<Vec3b> buf(it.count); for(int i = 0; i < it.count; i++, ++it) buf[i] = *(const Vec3b)*it; // alternative way of iterating through the line for(int i = 0; i < it2.count; i++, ++it2) { Vec3b val = img.at<Vec3b>(it2.pos()); CV_Assert(buf[i] == val); } ,您可以执行以下操作:

假设8位,3通道图像

vector<Vec3b> buff

leftToRight包含pt1和pt2之间点的像素值,您可以使用它来绘制w.r.t图。 pt1和pt2。

通过Mockito链接,您可以看到标记Vec3b的含义以及如何使用它将像素值从pt1映射到pt2,反之亦然。

如果图片不是Vec3f,则可以使用其他类型,例如uchar表示浮点值,{{1}}表示单通道图像,依此类推

希望它有所帮助!