2016-01-12 69 views
4

我想在opencv C++中使用convertTo()。但是,一個錯誤彈出說convertTo在opencv中不工作

左:的ConvertTo必須有類/結構/聯合

方案低於:

for (i = 0; i < height; i += 8) 
{ 
    for (j = 0; j < width; j += 8) 
    { 
     Mat block = dctImage(Rect(j, i, 8, 8)); 
     vector<Mat> planes; 
     split(block, planes); 
     vector<Mat> outplanes(planes.size()); 
     for (k = 0; k < planes.size(); k++) { 
      planes[k].convertTo(planes[k], CV_32FC1); 
      dct(planes[k], outplanes[k]); 
      outplanes[k].convertTo(outplanes[k], CV_8UC1); 
     } 
    } 
} 
+1

此代碼適用於我...請發佈[mcve] – Miki

+0

您是否確保爲Visual Studio版本使用正確的OpenCV-dll(如果您使用的是vs)?有時候這會導致怪異的程序行爲。我曾經忘記了文件夾VC12不適用於VS2012,並且遇到了這樣的問題。 – Mickey

回答

1

我不知道如果.convertTo()可以處理情況相同的來源和目的地。您可能想嘗試使用一對臨時變量來解決您的錯誤消息。下面是相關的部分從你的例子:

// ... 
    for (k = 0; k < planes.size(); k++) { 
     Mat planes_k, outplanes_k;      // <-- Added temporaries. 
     planes[k].convertTo(planes_k, CV_32FC1); 
     dct(planes_k, outplanes_k); 
     outplanes_k.convertTo(outplanes[k], CV_8UC1); 
    } 
    // ... 

UPDATE

按照source code of .convertTo()是不是真的需要我的建議(感謝指出這一點,@ boaz001)。

+0

這不是必需的。如果目的地的類型與源不匹配,則重新分配。這可以通過在''''convertTo'''之前/之後打印'''planes [k] .type()'''來驗證。 – boaz001

+0

@ boaz001嗯,看起來你是對的。根據[.convertTo()']的源代碼(https://github.com/Itseez/opencv/blob/master/modules/core/src/convert.cpp#L4807),我的建議是沒有必要的。 – nils

1

左側語句表明它的空值或未定義的 即 outplanes [k]不包含您認爲應該的值。

我做了快速搜索,它看起來像這可能是一個編譯器的問題,即它有難度的理解/解釋線...

vector<Mat> outplanes(planes.size()); 

https://en.wikipedia.org/wiki/Most_vexing_parse

什麼是outplanes?它是否正確實例化?

的「Most_vexing_parse」文章建議,幫助編譯器有額外的括號

vector<Mat> outplanes((planes.size())); 

有點兒取決於您的代碼和什麼outplanes方法/類實際上是幹什麼的,但我想它不返回你認爲它應該是。