2016-11-01 3 views
1

Ich brauche ein Differenzbild von zwei Bildern zu erstellen und die Größe/Länge der Differenz eines jeden PixelsCompute Abstand Länge zwischen Pixelwerten in OpenCV

ich dies derzeit tun haben wollen:

cv::Mat diff = cv::abs(img1 - img2); 
cv::Mat diffLen(diff.size(), CV_32FC1); 
for(int x = 0; x < diff.size().width; ++x) 
    for(int y = 0; y < diff.size().height; ++y) 
    { 
     float d = cv::norm(diff.at<Vec3f>(Point(x,y))); 
     diffLen.at<float>(Point(x,y)) = d; 
    } 

Gibt es einen bequemeren Weg, dies zu tun?

+0

Wie würden Sie die "Größe/Länge" zwischen 2 Pixeln mit den Werten "R1, G1, B1" und "R2, G2" definieren. B2' – ZdaR

+0

@ZDaR wie die L2-Norm jetzt in meinem Code. Es macht in meinem Fall Sinn. – H4kor

Antwort

1

Mai werden Sie ParallelLoopBody verwenden können:

class ParallelNorm : public ParallelLoopBody 
{ 
private: 
    Mat &diff; 
    Mat &diffLen; 

public: 
    ParallelNorm(Mat& pDiff,Mat &result) : 
     diff(pDiff), 
     diffLen(result) 
     {} 
    virtual void operator()(const Range& range) const 
    { 

     for (int x = range.start; x < range.end; ++x) 
     { 
      for (int y = 0; y < diffLen.rows; ++y) 
      { 
       float d = cv::norm(diff.at<Vec3f>(Point(x, y))); 
       diffLen.at<float>(Point(x, y)) = d; 
      } 

     } 
    } 
}; 

und statt der Schleife Verwendung

ParallelNorm x(diff,diffLen); 
parallel_for_(Range(0,diff.cols),x); 

In Schleife können Sie Zeiger verwenden, wenn Sie x und y tauschen ...