C++ 使用LineIterator沿直线访问像素强度值

C++ 使用LineIterator沿直线访问像素强度值,c++,ios,swift,opencv,image-processing,C++,Ios,Swift,Opencv,Image Processing,我是opencv的新手,所以我希望能在我的任务中得到帮助。我用Swift构建了一个绘图iOS应用程序。用户能够绘制线并返回端点(x,y)中的像素位置数组。用户绘制的画布与用户可以选择的图片大小相同。我想让LineIterator沿着端点数组定义的线访问图像的像素强度值。由于行是分段的,我认为每个段都会有一个新的LineIterator。然后,返回一个包含像素位置和相应强度值的数组,以便为这两个值绘制图表。到目前为止,这是我在OpenCVWrapper.mm中的内容 +(NSMutableArra

我是opencv的新手,所以我希望能在我的任务中得到帮助。我用Swift构建了一个绘图iOS应用程序。用户能够绘制线并返回端点(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对象并访问像素强度值。谢谢

要使用
cv::LineIterator
,可以执行以下操作:

假设为8位、3通道图像

//沿直线抓取像素(pt1、pt2)
//从8位3通道图像到缓冲区
行迭代器it(img、pt1、pt2、8);
LineIterator it2=它;
向量buf(it.count);
for(int i=0;i
vector buff
包含pt1和pt2之间点的像素值,可用于绘制图w.r.t.pt1和pt2

在下面的链接中,您可以看到标志
leftToRight
的含义,以及如何使用它将像素值从pt1映射到pt2,或从pt1映射到pt2

如果图像不是
Vec3b
,您可以使用其他类型,例如
Vec3f
表示浮点值,
uchar
将用于单通道图像等

希望有帮助

// 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);
}