閱讀好天氣
分享自己在工作與生活學習到的東西
2023年12月31日 星期日
Cmder使用紀錄
2022年2月28日 星期一
Dlib install 環境建置(Visual Studio Community 2013 & Dlib v19.22)
Step1.下載Dlib 的套件,可以從Google搜尋到,並下載19.22版本
Step2.解壓縮完之後,新增一個Install資料夾,等等用Cmake編譯好的東西會出現在這裡
Step4.開啟Cmake-gui
Step5.選擇適合自己的版本,並進行Configure
Step7.開啟專案後,針對ALL_BUILD建置
Step8.再針對INSTALL建置
Step9.最後放入程式碼,這邊參考Dlib官網的範例,如果可順利跑出結果就代表環境建置好啦
#include <dlib/gui_widgets.h>
#include <dlib/image_io.h>
#include <dlib/image_transforms.h>
#include <fstream>
using namespace std;
using namespace dlib;
// ----------------------------------------------------------------------------
int main(int argc, char** argv)
{
try
{
// make sure the user entered an argument to this program
if (argc != 2)
{
cout << "error, you have to enter a BMP file as an argument to this program" << endl;
return 1;
}
// Here we declare an image object that can store rgb_pixels. Note that in
// dlib there is no explicit image object, just a 2D array and
// various pixel types.
array2d img;
// Now load the image file into our image. If something is wrong then
// load_image() will throw an exception. Also, if you linked with libpng
// and libjpeg then load_image() can load PNG and JPEG files in addition
// to BMP files.
load_image(img, argv[1]);
// Now let's use some image functions. First let's blur the image a little.
array2d blurred_img;
gaussian_blur(img, blurred_img);
// Now find the horizontal and vertical gradient images.
array2d horz_gradient, vert_gradient;
array2d edge_image;
sobel_edge_detector(blurred_img, horz_gradient, vert_gradient);
// now we do the non-maximum edge suppression step so that our edges are nice and thin
suppress_non_maximum_edges(horz_gradient, vert_gradient, edge_image);
// Now we would like to see what our images look like. So let's use a
// window to display them on the screen. (Note that you can zoom into
// the window by holding CTRL and scrolling the mouse wheel)
image_window my_window(edge_image, "Normal Edge Image");
// We can also easily display the edge_image as a heatmap or using the jet color
// scheme like so.
image_window win_hot(heatmap(edge_image));
image_window win_jet(jet(edge_image));
// also make a window to display the original image
image_window my_window2(img, "Original Image");
// Sometimes you want to get input from the user about which pixels are important
// for some task. You can do this easily by trapping user clicks as shown below.
// This loop executes every time the user double clicks on some image pixel and it
// will terminate once the user closes the window.
point p;
while (my_window.get_next_double_click(p))
{
cout << "User double clicked on pixel: " << p << endl;
cout << "edge pixel value at this location is: " << (int)edge_image[p.y()][p.x()] << endl;
}
// wait until the user closes the windows before we let the program
// terminate.
win_hot.wait_until_closed();
my_window2.wait_until_closed();
// Finally, note that you can access the elements of an image using the normal [row][column]
// operator like so:
cout << horz_gradient[0][3] << endl;
cout << "number of rows in image: " << horz_gradient.nr() << endl;
cout << "number of columns in image: " << horz_gradient.nc() << endl;
}
catch (exception& e)
{
cout << "exception thrown: " << e.what() << endl;
}
}
參考:
1.http://dlib.net/
2021年7月25日 星期日
Git 版本管控(二)-Git的環境建置
延續上次的Git 版本管控(一)-淺談版本管控,這次則是要說明如何建置Git的環境,廢話不多說直接往下看~
步驟1:搜尋Git官網,並點選Download for windows,版本可能會有些差異,但使用上不會差太多
再來就是下載GUI,我自己偏向使用Git Extensions(一樣有免安裝版本),後續也是用此作教學說明
步驟2:下載KDiff3(下載連結),而KDiff3主要可幫助我們做程式碼比對,使用上很方便
步驟3:確認下載與安裝Git、Git Extensions、KDiff3完成後,就能開始操作GUI,而使用前要先將Git與KDiff3路徑設定完才能使用!!
初次開啟Git Extensions會先出現須設定的CheckList,如下圖所示,要針對橘色部分做修復
2021年6月12日 星期六
Line 跨系統聊天紀錄轉移
今年四月的時候,因手上安卓手機已經用了快五年,感覺已經不能再撐下去了,因此萌生換手機的念頭,而自己對手機的要求也不高,用起來不要卡卡就可以,然後身邊朋友總說蘋果手機用久都不太卡頓,所以這次我決定要來跳槽,剛好親戚有不要的二手iPhone 7 plus 128G,因而我就大膽的買下去!!
當然,拿到新手機很開心,但我馬上遇到一個問題,就是遇到跨系統時,Line的聊天紀錄似乎沒這麼好處理,所以我詢問一些有跳槽經驗的朋友,同時也上網查一些資料,得到的結果大概就兩種,第一種是官方說法,正常無法轉移聊天紀錄,所以蠻多人直接放棄轉移,若有聊天紀錄需要,則會從電腦版的Line去查找;第二種就是訪間有些付費軟體可以協助轉移,但過程也小複雜....後來我想想,其實也沒有非得保留舊聊天紀錄,所以決定放棄轉移了,直接另起爐灶。
但,當我將Line從安卓轉到蘋果時,我依照正常流程輸入手機號碼,且事前沒有備份到iCloud雲蝶(廢話),所以我選擇不復原聊天紀錄,常理來說進入到主畫面時,應該要是全空的狀態,但.....神奇的事情發生了,我點開我的蘋果 Line,竟發現有聊 ! 天 ! 紀 ! 錄 ! 突然覺得大腦充滿困惑,我到目前也完全不知道怎做到的,可能是老天賞賜給我的奇蹟吧!
事後想想,唯一的可能性,起先因為app剩Line還沒完全轉移,所以有一段時間我是安桌與蘋果手機同時使用,因為比較常使用Line,所以我幾乎都用安卓,然後分享網路給蘋果,聽起有點搞笑,哈哈哈,但這可能是個關鍵!!猜想會不會因為我在安卓分享網路給蘋果狀態下,再進行Line的轉移動作,間接也將聊天內容轉到蘋果呢?但過了一段時間後,原先以為全都轉移的聊天紀錄,其實只將二月到四月這範圍的聊天紀錄轉移過來,去年甚至更久以前的就都沒有轉過來,但至少有總比沒有好!!
最後,這個方法我並沒有再回去測試一遍,因為怕到時就真的全空了!但對於某些人如果跟我一樣,原先想放棄舊聊天紀錄,若這個方式可以幫你/妳保留近兩個月的聊天內容,其實我覺得還不錯,不會出現空白聊天視窗,然後不知怎麼接的感覺,整體來說我覺得是可以嘗試看看,萬一沒有成功,其實心裡也不會太難過,但如果成功了,我覺得心裡應該會蠻爽的!!!!!
僅供參考瞜~
2021年5月24日 星期一
心情札記-2021.05.24
今天窩了一整天的宿舍,內心被程式與高溫弄得有點心煩,趁著傍晚天氣較涼到附近公園溜搭,走著走著,竟傳來久違的夏天氣息,那就是在樹上高歌的蟬聲,如此熱鬧般的蟬聲,對比人行道空冷的寂靜,顯得格外諷刺,看來這個夏天依舊不寧靜,願這疫情能早點結束,讓生活回到從前般的開心!!
2021年3月30日 星期二
Git 版本管控(一)-淺談版本管控
2021年3月20日 星期六
C# 使用C++ DLL檔(回傳值)
延續上篇(C# 使用C++ DLL檔)之後,一般使用DLL時,除了將參數提供給DLL演算法做使用,也需將演算法結果從DLL回傳回去,所以這次就來說明如何回傳結果給C#吧。
目前我了解到如果要從DLL回傳結果給C#,都會使用指標做回傳,而我先前測試經驗,C++撰寫上比較不會遇到問題,但在接收端C#有遇過接不到數值、接錯值、或是跑久還造成程式當掉,重點是DLL除錯還不怎麼容易,像是瞎子摸象的感覺,如果有人知道怎樣較快除DLL的Bug,再歡迎留言告訴我,感謝!!!經過一番的測試之後,我目前可正常回傳的資訊分別為字串與float陣列資訊。
Extern.cpp
#ifdef SYSALGORITHM_EXPORTS
#define SYSALGORITHM_API __declspec(dllexport)
#include "SysAlgorithm.h"
extern "C" SYSALGORITHM_API int add(int a, int b)
{
Calculator Calculator;
return Calculator.add(a, b);
}
extern "C" SYSALGORITHM_API int subtract(int a, int b)
{
Calculator Calculator;
return Calculator.subtract(a, b);
}
extern "C" SYSALGORITHM_API void getDLLValue(float * DLLvalue)
{
Calculator Calculator;
return Calculator.getDLLValue(DLLvalue);
}
extern "C" SYSALGORITHM_API void getDLLInfo(char * DLLInfo)
{
Calculator Calculator;
return Calculator.getDLLInfo(DLLInfo);
}
#endif
SysAlgorithm.h
#pragma once
#ifndef SYSALGORITHM_H
#define SYSALGORITHM_H
#include <fstream>
#include <string>
class Calculator
{
public:
Calculator();
~Calculator();
int add(int a, int b);
int subtract(int a, int b);
void getDLLValue(float * DLLvalue);
void getDLLInfo(char * DLLInfo);
};
#endif // !SYSALGORITHM_H
SysAlgorithm.cpp
#include "SysAlgorithm.h"
Calculator::Calculator()
{
}
Calculator::~Calculator()
{
}
int Calculator::add(int a, int b)
{
return(a + b);
}
int Calculator::subtract(int a, int b)
{
return(a - b);
}
void Calculator::getDLLValue(float * DLLvalue)
{
DLLvalue[0] = 0;
DLLvalue[1] = 1.2;
DLLvalue[2] = -1.2;
}
void Calculator::getDLLInfo(char * DLLInfo)
{
char Info[20] = " return DLLInfo";
strcpy_s(DLLInfo, strlen(Info) + 1, Info);
}
C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace SysUI
{
public partial class Form1 : Form
{
[DllImport("SysAlgorithm.dll", EntryPoint = "add", CallingConvention = CallingConvention.Cdecl)]
private static extern int add(int a, int b);
[DllImport("SysAlgorithm.dll", EntryPoint = "subtract", CallingConvention = CallingConvention.Cdecl)]
private static extern int subtract(int a, int b);
[DllImport("SysAlgorithm.dll", EntryPoint = "getDLLValue", CallingConvention = CallingConvention.Cdecl)]
private static extern void getDLLValue([MarshalAs(UnmanagedType.LPArray)]float[] value);
[DllImport("SysAlgorithm.dll", EntryPoint = "getDLLInfo", CallingConvention = CallingConvention.Cdecl)]
private static extern void getDLLInfo(StringBuilder DLLInfo);
private StringBuilder DLLInfo = new StringBuilder(20);
private float[] DLLvalue = new float[3];
public Form1()
{
InitializeComponent();
label1.Text = add(3, 5).ToString();
label2.Text = subtract(3, 5).ToString();
getDLLValue(DLLvalue);
getDLLInfo(DLLInfo);
label6.Text = DLLvalue[0].ToString() + "," + DLLvalue[1].ToString("F2") + "," + DLLvalue[2].ToString("F2");
label8.Text = DLLInfo.ToString();
}
}
}
2021年2月20日 星期六
OpenCV Trackbar
createTrackbar("Param1", "Window", &Param1, SliderMax, on_trackbar); createTrackbar("Param2", "Window", &Param2, SliderMax, on_trackbar);
#include <cstdio>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
const int SliderMax = 100;
int Param1 = 50;
int Param2 = 0;
Mat GrayImg, OutputImg;
static void on_trackbar(int, void*)
{
double Alpha = (float)Param1 / 50;
double Beta = Param2;
GrayImg.convertTo(OutputImg, -1, Alpha, Beta);
imshow("Window", OutputImg);
}
int main(){
Mat SrcImg = imread("dog.jpg", CV_LOAD_IMAGE_COLOR);
namedWindow("Window", WINDOW_AUTOSIZE);
cvtColor(SrcImg, GrayImg, CV_BGR2GRAY);
createTrackbar("Param1", "Window", &Param1, SliderMax, on_trackbar);
createTrackbar("Param2", "Window", &Param2, SliderMax, on_trackbar);
waitKey(0);
return 0;
}
2020年12月31日 星期四
OpenCV findhomography(單應性矩陣)與warpperspective(透視變換)
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(){
Mat SrcImg1 = imread("SrcImg.jpg", CV_LOAD_IMAGE_COLOR);
Mat DstImg = Mat::zeros(Size(3500, 1500), CV_8SC1);
vector PtData1, PtData2;
PtData1.push_back(Point2f(513,627));
PtData1.push_back(Point2f(233, 2000));
PtData1.push_back(Point2f(3877, 2047));
PtData1.push_back(Point2f(3855, 835));
PtData2.push_back(Point2f(0, 0));
PtData2.push_back(Point2f(0, 1500));
PtData2.push_back(Point2f(3500, 1500));
PtData2.push_back(Point2f(3500, 0));
Mat HomogMat = findHomography(PtData1, PtData2, CV_RANSAC);
warpPerspective(SrcImg1, DstImg, HomogMat, DstImg.size());
imwrite(" DstImg.bmp", DstImg);
return 0;
}