【问题标题】:Use LineIterator to access pixel intensity values along a line使用 LineIterator 沿线访问像素强度值
【发布时间】:2017-12-14 18:49:28
【问题描述】:

我对 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 对象并访问像素强度值。谢谢!

【问题讨论】:

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


    【解决方案1】:

    为了使用cv::LineIterator,你可以这样做:

    假设 8 位,3 通道图像

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

    vector&lt;Vec3b&gt; buff 包含 pt1 和 pt2 之间点的像素值,您可以使用它来绘制 w.r.t 的图形。 pt1 和 pt2。

    this 链接之后,您可以看到标志leftToRight 的含义以及如何使用它来将像素值从pt1 映射到pt2,反之亦然。

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

    希望对你有帮助!

    猜你喜欢
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    相关资源
    最近更新 更多