2020年7月22日 星期三

[log book] opencv 使用ROI卻無法改變ROI影像內的值

[問題描述]
在撰寫一個特別的演算法時,
需要只針對某一行做運算,因此使用cv::Rect做了一個ROI,
將某一行取出做運算,但發現我不太能修改ROI取出的影像的值。

linux 下 Vim NeoDebug 套件使用方法筆記

若是用VS久了,在Linux下debug會覺得有點不習慣,因為要記、打一堆gdb相關指令。
筆者最近發現了一個好用的vim套件 ─ NeoDebug,下面來介紹安裝及使用方法。

筆者是在始碼的資料夾下建一個build資料夾,接著使用cmake 生成Makefile後,再使用「cmake --build build」指令在build資料夾編譯原始碼成執行檔

[Log Book] 解決函式回傳char*時,傳出去後出現亂碼

[問題描述]
最近遇到一個問題我有一個函式GetTime函式回傳char*,
在GetTime函式中,要傳出去的變數currentTime值是非常正常的,
如下圖
但在外面接到的,卻變亂碼。

2020年5月17日 星期日

SikuliX安裝筆記

最近快到FGO的金閃祭了,
想要讓電腦幫我周回,
但bluestack的腳本功能並不能滿足我,
因為我的練度不高,所以不只要可以記錄我的點擊位置,有時也要選擇從者或是判斷一些簡單的狀況。
雖然照著官網的方式做,但小卡關,
後來找到了資料[1],發現只差一點點就成功了,
但怕後來忘了,所以寫做筆記,
而且我發現我參考資料[1]中的作者,也是為了玩FGO所以才寫sikuli的 XD

2020年4月18日 星期六

用「附加至處理程序(Attach to Process ...)」Debug

今天來分享一個好用的dll debug方式!

之前在上海幫忙的時候,
jim就有教過我們用「附加至處理程序」(Attach to Process ...),
並跟我們說這個功能很好用,
不過當時並沒有體會到這個功能好用的地方。

在上海負責的案子比較特殊,
是用CCF (CIM Control Framework)的框架,
而那個框架是用分散式架構,分程三支程式;分別放在三台電腦中,
重點是開啟是有順序的。
若用一般debug的手法會很難debug,
直接按下F5,然後下斷點,會不好debug,
除了程式啟動的順序外,
彼此的dll都有一些關聯,這樣做可能會出問題。
所以一直以為,
那個「附加至處理程序」(Attach to Process ...),
是因為CCF的架構不好debug才使用的。

但今天才發現,這個功能真的爆幹好用!
一般來說,如果方案較大,裡面包含有dll的專案,
在debug dll時,就要將dll設成啟始專案,

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");
}
下面是錯誤訊息