型態若為 unsigned 則補 0
若為 signed ,則正數補 0,負數補 1
2009年12月20日 星期日
2009年11月26日 星期四
[C/C++] 讓 Visual C++ 2008 的程式在別的電腦上執行
除了在要執行的電腦上安裝相對應的 .Net Framework,編譯的組態也要選擇成 Release,再到 專案 -> 選項 -> 組態屬性 -> 一般 -> MFC 的使用 -> 使用 MFC 的靜態程式庫
2009年11月20日 星期五
[Robot] Roboard 和 Webcam
在實驗室裡用了不同的 Webcam 測試,
發現不同的 Webcam 在 Roboard 上效能也有差。
用 OpenCV 對 20 張 frame(320x240) 作擷取紅色部分,結果 :
QuickCam Communicate Deluxe 4.0s
QuickCam Pro 5000 ?s
QuickCam Pro 4000 5.6s
Altar 8.4s (640x480)
QuickCam Communicate STX 12.4s
QuickCam Easy/Cool ?s
QuickCam Orbit/Sphere ?s
而且用 Logitech QuickCam 的程式還抓不到影像,( 跟不支援 MMX 好像有關係 )
用 Windows API 的就可以。
用 OpenCV 對 20 張 frame(320x240) 作擷取紅色部分,結果 :
QuickCam Communicate Deluxe 4.0s
QuickCam Pro 5000 ?s
QuickCam Pro 4000 5.6s
Altar 8.4s (640x480)
QuickCam Communicate STX 12.4s
QuickCam Easy/Cool ?s
QuickCam Orbit/Sphere ?s
而且用 Logitech QuickCam 的程式還抓不到影像,( 跟不支援 MMX 好像有關係 )
用 Windows API 的就可以。
2009年11月17日 星期二
為了在 Roboard 上灌 XP,搞了很久,
我把 Windows XP + Roboard 的 IDE 包成一個映像檔 WinLite.iso,
然後在用 usb_prep8 把 WinLite.iso 掛到 SD 卡上,
結果出現了一堆 FIND: Windows NT: No such file or directory
我把 Windows XP + Roboard 的 IDE 包成一個映像檔 WinLite.iso,
然後在用 usb_prep8 把 WinLite.iso 掛到 SD 卡上,
結果出現了一堆 FIND: Windows NT: No such file or directory
[ 錯誤訊息 ]
以為是 SD 不能用換了 USB,還是不行,在從 8G 換到 4G,都不行。
結果在西班牙的論壇上看到解決的方法 ( 有 google 翻譯真好 )
居然是因為 WinAVR !
C:\WinAVR-20080610\utils\bin\find.exe
把那個 find.exe 改成 find.exe.bak 就行了。
2009年11月2日 星期一
[BCB] TImage 和 TBitmap
在 BCB 裡,讀取 TImage 的像素和 TBitmap 的像素時間是差不多的,
但是寫入的時間卻是差很多,我用四種方法對同一個位置寫了 100000 次,
// 執行時間: 0.125s
for (int i = 0; i < 100000; i++)
TheBitmap->Canvas->Pixels[0][0] = TColor(RGB(0, 0, 0));
// 執行時間: 0.125s
for (int i = 0; i < 100000; i++)
TheBitmap->Canvas->Pixels[0][0] = clBlack;
// 執行時間: 0.969s
for (int i = 0; i < 100000; i++)
Image1->Canvas->Pixels[0][0] = TColor(RGB(0, 0, 0));
// 執行時間: 0.969s
for (int i = 0; i < 100000; i++)
Image1->Picture->Bitmap->Canvas->Pixels[0][0] = TColor(RGB(0, 0, 0));
結果發現,TBitmap 的寫入時間較快,此外搭配 ScanLine[] 和指標會比直接設
Pixels 快上 50 倍以上,所以要畫圖最好用間接的方式 :
Pixels 快上 50 倍以上,所以要畫圖最好用間接的方式 :
Graphics::TBitmap *TheBitmap;
TheBitmap = new Graphics::TBitmap();
TheBitmap->Height = h;
TheBitmap->Width = w;
對 TBitmap 寫值...
Image1->Picture->Bitmap = TheBitmap;
這樣會有較好的執行效率,也可以避免畫面閃爍。
2009年10月28日 星期三
用鍵盤操作滑鼠
可以直接按快捷鍵 Alt + Shift + NumLk
筆電鍵盤可能就要按 Alt + Fn + Shift + NumLk
按不出來,直接開控制台出來改也是可以。
XP 跟 Vista 好像都有這個功能。
筆電鍵盤可能就要按 Alt + Fn + Shift + NumLk
按不出來,直接開控制台出來改也是可以。
XP 跟 Vista 好像都有這個功能。
2009年10月9日 星期五
BMP 的 imagesize 怎麼算?
在BMP檔案裡,22H~25H的位置用 4 bytes 表示了 imagesize,
很直覺的會認為 BMP = height * width * bits / 8,
但事實上在一般電腦裡每次存取 4 bytes 的速度是較快的,
所以BMP來說,就會自動補 0 來至能夠讓 4 整除的大小,
例如:
有一張 BMP 的大小
width = 90
height = 30
bits = 24
imagesize = 8160
照理說應該會是 90 * 30 * 24 / 8 = 8100 (無法被4整除)
所以都會在 width 的右邊補 0 至能讓 4 整除,
90 * 3 / 4 = 67...2
(67+1) * 4 = 272 ( 每行多補了 2 bytes )
結果,272 * 30 = 8160
但事實上在一般電腦裡每次存取 4 bytes 的速度是較快的,
所以BMP來說,就會自動補 0 來至能夠讓 4 整除的大小,
例如:
有一張 BMP 的大小
width = 90
height = 30
bits = 24
imagesize = 8160
照理說應該會是 90 * 30 * 24 / 8 = 8100 (無法被4整除)
所以都會在 width 的右邊補 0 至能讓 4 整除,
90 * 3 / 4 = 67...2
(67+1) * 4 = 272 ( 每行多補了 2 bytes )
結果,272 * 30 = 8160
2009年9月28日 星期一
[C/C++] read in binary mode
如果想讀資料中每個 byte 的資料,下例看似正常沒什麼奇怪的。
Data : 42 4D 20 2A 3C 1A 42 43 ...
fp = fread(“data”, “r”);
c = fgetc(fp);
但這其實是錯的,當讀到 1A 時,後面接著讀的資料全都會變成 FFFFFFFF,
因為 1A 在 ASCII 裡代表的是 Substitue,也就是 Crtl + Z,
不知道程式讀到這裡的時候,是不是自己判斷暫停了?
最保險的方法還是加上 b 吧!
fp = fread(“data”, “rb”);
因為 1A 在 ASCII 裡代表的是 Substitue,也就是 Crtl + Z,
不知道程式讀到這裡的時候,是不是自己判斷暫停了?
最保險的方法還是加上 b 吧!
fp = fread(“data”, “rb”);
2009年4月14日 星期二
[C/C++] 更改變數的位元值
假設 int a = 0xFFFFFFF1,
想要將 3rd bit 設成 1,且不更動到其他 bits 的值,該怎麼用 C 來寫呢?
其實只要用 CLEAR 和 OR 就可以達成,什麼語言都一樣,
int MASK = 0x04; // 3rd bit is what we choose
a &= ~MASK; // CLEAR bit
a |= MASK; // SET bit
最後,
a = 0xFFFFFFF5
就是我們要結果啦!
訂閱:
文章 (Atom)