我对 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/