2016-05-01 17 views
0

私は2つの平行した緑色の線でマークされた画像(下記参照)を持っています。この画像はC++のOpenCV Matで読み取られ、緑の線の傾きと画像中心までの距離はすでに分かっています。OpenCV:画像の特定の領域の各ピクセルを反復する方法

ここで、この2つの緑色の線の間の領域内のすべてのピクセルを繰り返したいとします。どうすればこの問題を解決できますか?誰かが私にコード例を与えることができれば、とても助かります。

多くのありがとうございます。

Example Image

答えて

3

スロープ式は以下の通りです:

y = mx + b 

あなたがそれらのうちの2つを持っているので、あなたは2つのスロープ式持っている必要があります。

y1 = m1x1 + b1 
y2 = m2x2 + b2 

m1, m2, b1, b2を知る必要があります。

あなたがしなければならないのはy1 = 0y2 = 0で開始し、上から下に各y1 = y2ためx2からx1の間を反復です。

例コード:

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. 
    } 
} 
+0

ありがとうございます。しかし、各ループについて、x座標を計算しなければならない。私は画像行列の各ピクセルの位置オフセットを計算するソリューションが必要です。 – rayallen

+0

私はまったくフォローしていません、探しているものをもう少し説明できますか? –

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

関連する問題