c++ - 使用 LineIterator 访问沿线的像素强度值

标签 c++ ios swift opencv image-processing

我对 opencv 完全陌生,所以我希望有人帮助我完成我的任务。我使用 Swift 构建了一个绘图 iOS 应用程序。用户能够绘制线条并返回端点 (x, y) 中像素位置的数组。用户在其上绘制的 Canvas 与用户可以选择的图片的大小相同。我希望 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 channel 图像

// 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<Vec3b> buff包含 pt1 和 pt2 之间点的像素值,您可以使用它来绘制图表。 pt1 和 pt2。

已关注 this链接,可以看到flag leftToRight是什么方法以及如何使用它将像素值从 pt1 映射到 pt2,反之亦然。

如果图像是 Vec3b 以外的其他内容,您可以使用其他类型,例如 Vec3f表示浮点值,uchar将用于单 channel 图像等。

希望对你有帮助!

关于c++ - 使用 LineIterator 访问沿线的像素强度值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45022149/

相关文章:

c++ - 获取标准库函数地址/可能格式错误的行为的替代方法

c++ - 何时释放 unique_ptr?

ios - 使用 NSUserDefaults.standardUserDefaults().registerDefaults(Dictionary<String, AnyObject>) 设置默认值的有效方法是什么?

android - 压缩手机上的文件并将其上传到服务器?

ios - iOS 7 中的自定义字体

c++:PThread 调度与 Windows 线程

c++ - enable_if 未排除模棱两可的模板参数

ios - 如何使用指定的线路用户 ID 聊天屏幕打开线路应用程序?

iOS UITextView 的属性文本不从 View 顶部显示

ios - Firebase 数据库观察速度慢