OpenCV:如何迭代图像特定区域中的每个像素

时间:2016-05-01 18:05:32

标签: c++ opencv pixel

我有一个图像(见下文),由两条平行的绿线标记。该图像在C ++中的OpenCV Mat中读取,绿线的斜率和它们到图像中心的距离是已知的。

现在我想迭代这两条绿线之间区域的所有像素。我怎么解决这个问题?如果有人可以给我一个代码示例,那将非常有用。

非常感谢。

Example Image

2 个答案:

答案 0 :(得分:3)

斜坡的公式如下:

y = mx + b

由于你有两个,你应该有两个斜率公式:

y1 = m1x1 + b1
y2 = m2x2 + b2
应该知道

m1, m2, b1, b2

您需要做的就是从y1 = 0y2 = 0开始,并从上到下为每个x1x2y1 = 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;

}

结果图片(查看编辑历史记录以了解更改):

enter image description here enter image description here