2017-04-24 21 views
1

基本上我想乘以矢量的圖像的每個通道值。例如Vec4f(1,2,3,4)1 *圖像2的紅色通道*綠色通道等等這裏是我的代碼(不是一個完整的代碼,有一些錯誤),但我的老闆說,必須有更好更簡單的方法與opencv,但我無法找到。預先感謝。用給定的矢量乘以每個通道像素

 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

非常感謝安東尼奧,但墊*標給出錯誤 –

回答

0

好吧,這是一個有點奇怪的問題。我不認爲任何人都需要這個功能,但萬一......是因爲它花了我2-3天(僅25行)

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

我不確定你喜歡做什麼,但想到cv :: multiply?

  • 你使用哪種版本的opencv?
  • 它是常數因子還是常數矩陣?
+0

只是一個嵌套類。 。const源碼。 Mat在TextureData類中(基本上來源是Mat)。我使用最新版本的opencv –