我试图访问2个非线性点之间的所有像素。但我不能这样做。 简单来说,使用cvLine函数我在两点之间绘制一条线,如下图所示(我想要访问2个红点之间沿绿线的像素)。
我尝试了以下内容:
Rect myROI(midPx, midPy, (edgPx-midPx), (midPy-edgPy)+1);
Mat croppedImage = mask(myROI);
在我的情况下不起作用。
任何人都可以帮我解决这个问题吗?
对不起,实际上我尝试了同样的例子,在评论时是错误的。我尝试了示例中的两种方法;
LineIterator it(mask, Point(midPx, midPy), Point(edgPx, edgPy), 8);
LineIterator it2 = it;
vector<Vec3b> buf(it.count);
//cout << buf<< endl;
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)
//{
// cout <<it2.pos()<<","<<val<< endl;
//buf.at<Vec3b>(Point(i,0)) = val;
//}
imshow("buf Image", buf);
但在buf [i]
处留下错误erreur: no match for ‘operator*’ in ‘*cv::Vec<unsigned char, 3>(((const unsigned char*)it.cv::LineIterator::operator*()))
答案 0 :(得分:1)
查看LineIterator,它用于获取一行的每个像素,并允许您处理它们:http://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html#lineiterator
小例子(基于链接):
// grabs pixels along the line (pt1, pt2)
// from 8-bit 3-channel image to the buffer
LineIterator it(img, pt1, pt2);
vector<Vec3b> buf(it.count);
// iterate through the line
for(int i = 0; i < it.count; i++, ++it)
buf[i] = *(const Vec3b)*it;