我是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对象并访问像素强度值。谢谢!
答案 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}}表示单通道图像,依此类推
希望它有所帮助!