2020年1月17日 星期五

opencv 及halcon存圖的速度比較

執行平台:
visual 2015
opencv 3.1
halcon 12.0.2

圖檔:
用ink一眼的圖測試之
16384 * 300000 pixels
約 1.52 G 

結果:
Mat > iplimage > halcon

mat存圖比較快,大多在十三秒左右,有時候不知為什麼,會到十七秒將近二十秒;iplimage存圖次之,約十七秒左右,有時候會到廿一秒;halcon最慢,約在卅八秒左右,但速度好像都滿穩定的。
對了,經由這次的測試發現,imshow及image watch好像没法看1.52 G的圖,我猜它們只能顯示1 G以內的圖。

2020年1月16日 星期四

[Log book] stringstream的建構子中不可傳入其他建構子

─ 問題描述
目標:在win 10環境下使用VS 2008的C++讀入ini檔並用逗點分隔讀入的key值
使用方法及問題:使用std的iostream類的函式,並用getline來分割,但在getline的函式一直編譯出錯,編譯器一直顯示引數類型不正確、没有相關多載之類的錯誤訊息。
下面是程式碼
#include <iostream>
#include <iomanip>
#include <vector>
#include <string>
#include <sstream>
#include "tchar.h"  
#include "windows.h"
#define COUNTOF(x)  ( sizeof(x) / sizeof((x)[0]) )
bool GetCurrentDirectory(TCHAR *obuf, DWORD osize)
{
    if ( ! GetModuleFileName(0, obuf, osize) )
    {
        *obuf = '\0';
        return FALSE;
    }
    TCHAR *lastslash = 0;
    for ( ; *obuf; obuf ++)   
    {   
        if ( *obuf == '\\' || *obuf == '/' )   
            lastslash = obuf;   
    }   
    
    if ( lastslash ) *lastslash = '\0';  
    
    return TRUE;   
}
void main()
{
        TCHAR filebuf[256];
        char data[100];
        std::string tempStr;
        std::vector<std::string> output;
        if ( GetCurrentDirectory(filebuf, COUNTOF(filebuf)) )   
    {  
               wcscat_s(filebuf,_T("\\IrregularShapeSetting.ini"));
               TCHAR temp_str[100];
               ::GetPrivateProfileString(_T("Irregular Shape Setting"), _T("Folder"),  _T("="), temp_str, 100, filebuf);
               wcstombs(data, temp_str, 100);
               std::string ConverToStr = std::string(data);
               
               std::stringstream folders(std::string(data)); // 但問題在這
               while (std::getline(folders, tempStr, ',')) // 出錯在這行
                       output.push_back(tempStr);
               for(int i = 0; i < output.size(); i++)
                       std::cout << output[i].c_str() << std::endl;
    }   
    else
    {           
               wprintf_s(_T("ERROR: cannot get irregular shape inspection setting  directory\n"));
    }
        system("pause");
}
下面是錯誤訊息

nlohmann/json 使用筆記

因為工作的關係,有一支C++寫的程式要用到json來與另一支程式傳資料,
上網找C++的json函式庫,找到了一個好用的函式庫 ─ nlohmann大大的json。

nlohmann大大寫的json語義解析器非常好用,
而且安裝方法又簡單

[Log Book] C++\CLI Graphics使用Dispose時遇到 「'Dispose': is not a member of 'System::Drawing::Graphics'」

[問題描述]
在使用C++\CLI將自己寫的演算法包起來給.net使用時,
將System::Drawing::Graphics (managed class)使用Dispose方法釋放資源,
結果遇到「Error C2039 'Dispose': is not a member of 'System::Drawing::Graphics'」

C++及C++\CLI 修改指標變數的方法 (雙重指標的應用)

在原生的C++ (native C++)中,若要修改指標變數,會用雙重指標(指標的指標),
就像要修改某變數時,要將該變數的指標傳入函數一樣的道理。
下面是原生C++要修改指標變數時的方法
#include <iostream>

class UnmanagedClass
{
public:
int i;
};

void ModifyUnmanagedPointer(UnmanagedClass** p)
{
*p = new UnmanagedClass();
(*p)->i = 100;
}

void main()
{
UnmanagedClass* p;
ModifyUnmanagedPointer(&p);
std::cout << "value = " << p->i << std::endl;
system("pause");
}

其輸出為:


此道理在C++\CLI (C++的.net版本,以下簡稱CLI)中也不例外,
不過由於托管類別(managed class)都被托管,
沒辦法直接使用「^^」來做為托管指標的位址。
以下介紹兩種修改托管指標的方法: