2017-04-24 2 views
1

Grundsätzlich möchte ich jeden Kanalwert des Bildes mit Vektor multiplizieren. Zum Beispiel Vec4f (1,2,3,4) 1 * Roter Kanal von Bild 2 * Grüner Kanal und so weiter Hier ist mein Code (nicht ein vollständiger Code und hat einige Fehler) aber mein Chef sagt, es muss besser und einfacher Weg sein mit opencv aber ich konnte es nicht herausfinden. Danke im Voraus.Multiplizieren Sie jeden Kanal Pixel mit gegebenem Vektor

 void scaleImage(TextureData& dst, TextureData const& src, cv::Vec4f 
     const& scale) 
     { 


auto size = src.info.size; 
dst=src; 
cv::Mat bgr[4]; 
cv::split(src.levels[0].images[0], bgr); 

for (int y = 0; y < size.height; ++y) 
{ 
    for (int x = 0; x < size.width; ++x) 
    { 

     src.levels[0].images[0].channels(); 

     if (src.levels[0].images[0].channels() == 4) 
     { 
      auto& imgRGB = dst.levels[0].images[0].at<cv::Vec4f>(x, y); 
      imgRGB[3] = static_cast<uint8_t>(scale.w()*bgr[3].at[x, y]); 
      imgRGB[2] = static_cast<uint8_t>(scale.x()*bgr[2].at[x, y]); 
      imgRGB[1] = static_cast<uint8_t>(scale.y()*bgr[1].at[x, y]); 
      imgRGB[0] = static_cast<uint8_t>(scale.z()*bgr[0].at[x, y]); 

     } 

     if (src.levels[0].images[0].channels() == 3) 
     { 
      auto& imgRGB = dst.levels[0].images[0].at<cv::Vec3f>(x, y); 
      imgRGB[2] = static_cast<uint8_t>(scale.x()*bgr[2].at[x, y]); 
      imgRGB[1] = static_cast<uint8_t>(scale.y()*bgr[1].at[x, y]); 
      imgRGB[0] = static_cast<uint8_t>(scale.z()*bgr[0].at[x, y]); 
     } 

     if (src.levels[0].images[0].channels() == 2) 
     { 
      auto& imgRGB = dst.levels[0].images[0].at<cv::Vec2f>(x, y); 
      imgRGB[1] = static_cast<uint8_t>(scale.x()*bgr[2].at[x, y]); 
      imgRGB[0] = static_cast<uint8_t>(scale.y()*bgr[1].at[x, y]); 
     } 

     if (src.levels[0].images[0].channels() == 2) 
     { 
      auto& imgRGB = dst.levels[0].images[0].at<float>(x, y); 
      imgRGB[0] = static_cast<uint8_t>(scale.x()*bgr[2].at[x, y]); 
     } 

    } 
} 
+0

Vielen Dank Antonio kostet aber Mat * Skalar gibt Fehler –

Antwort

0

Okay, es ist ein kleines seltsames Problem. Ich glaube nicht, dass jemand diese Funktion aber im Fall muss ... sein weil es mich 2-3 Tage (nur 25 Zeilen)

void scaleImage(TextureData& dst, TextureData const& src, Vec4f const& 
    scale) 
    {  
    std::vector<cv::Mat> bgr(3); 
    std::vector<cv::Mat> resultMask(3); 
    src.info; 

    cv::split(src.levels[0].images[0], bgr); 
    //dst = src; 
    //auto size = src.info.size; 

    cv::Point anchor = cv::Point(-1, -1); 

     float a = scale.x(); 
     float b = scale.y(); 
     float c = scale.z(); 
     float d = scale.w(); 
     cv::Mat kern = (cv::Mat_<float>(3, 3) << 0, 0, 0, 
               0, a, 0, 
               0, 0, 0); 
     cv::Mat kern1 = (cv::Mat_<float>(3, 3) << 0, 0, 0, 
               0, b, 0, 
               0, 0, 0); 
     cv::Mat kern2 = (cv::Mat_<float>(3, 3) << 0, 0, 0, 
               0, c, 0, 
               0, 0, 0); 
     cv::Mat kern3 = (cv::Mat_<float>(3, 3) << 0, 0, 0, 
               0, d, 0, 
               0, 0, 0); 
     cv::filter2D(bgr[0], resultMask[0], bgr[0].depth(), kern, anchor, 0, 1); 
     cv::filter2D(bgr[1], resultMask[1], bgr[1].depth(), kern1, anchor, 0, 1); 
     cv::filter2D(bgr[2], resultMask[2], bgr[2].depth(), kern2, anchor, 0, 1); 
     //cv::filter2D(bgr[3], resultMask[3], bgr[3].depth(), kern3, anchor, 0, 1); 

     cv::merge(resultMask, dst.levels[0].images[0]); 
-1

Ich bin mir nicht sicher, was Sie tun möchten, aber über cv :: multiplizieren?

  • welche version von opencv verwenden sie?
  • Ist es ein konstanter Faktor oder eine konstante Matrix von Faktoren?
+0

Nur eine verschachtelte Klasse. . const Quelle. Mat ist in der TextureData-Klasse (im Grunde ist die Quelle eine Mat). Ich benutze die letzte Version von opencv –

Verwandte Themen