我有一个图像(见下文),由两条平行的绿线标记。该图像在C ++中的OpenCV Mat中读取,绿线的斜率和它们到图像中心的距离是已知的。
现在我想迭代这两条绿线之间区域的所有像素。我怎么解决这个问题?如果有人可以给我一个代码示例,那将非常有用。
非常感谢。
答案 0 :(得分:3)
斜坡的公式如下:
y = mx + b
由于你有两个,你应该有两个斜率公式:
y1 = m1x1 + b1
y2 = m2x2 + b2
应该知道 m1, m2, b1, b2
。
您需要做的就是从y1 = 0
和y2 = 0
开始,并从上到下为每个x1
在x2
到y1 = y2
之间进行迭代。< / p>
示例代码:
for (int y = 0; y < imageHeight; ++y)
{
int x1 = (y - b1) / m1;
int x2 = (y - b2) / m2;
for (int x = x1; x < x2; ++x)
{
// Do something.
}
}
答案 1 :(得分:3)
您可以使用LineIterator
看看下面的示例代码
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace std;
using namespace cv;
int main( int, char** argv )
{
Mat src;
src = imread( argv[1] );
if( src.empty() )
{
return -1;
}
Point pt1 = Point( (src.cols / 5) + (src.cols / 8), src.rows);
Point pt2 = Point( (src.cols ) - (src.cols / 8), 0);
LineIterator it(src, pt1, pt2, 8);
for(int y = 0; y < it.count; y++, ++it)
{
Point it_pos = it.pos();
for(int x = it_pos.x; x < it_pos.x+(src.cols / 5) & x < src.cols; x++)
{
Vec3b & pixel = src.at<Vec3b>(it_pos.y,x);
pixel = pixel * 1.3;
pixel[0] = 0;
}
}
imshow("result", src );
waitKey(0);
return 0;
}
结果图片(查看编辑历史记录以了解更改):