PIXNET Logo登入

在我心中有一個夢

跳到主文

我的程式備忘錄

部落格全站分類:數位生活

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 11月 15 週五 201312:36
  • BluetoothChatService改良

最近都在處理android藍芽傳輸的問題,雖然以前處理過不過被eclipse吃掉了,後面也忘記怎麼用,然後同學說官方有提供bluetooth chat的範例直接改比較快,但後來發現此範例字串有漏接的情況,最後改BluetoothchatService中ConnectThread的run部份解決了此問題,程式碼如下
public void run() {
Log.i(TAG, "BEGIN mConnectedThread");
// Keep listening to the InputStream while connected
while (true) {
Scanner scanner = new Scanner(mmInStream);
while( scanner.hasNext()) {
String readMessage = scanner.nextLine();
mHandler.obtainMessage(Oscillator.MESSAGE_READ, -1, -1, readMessage)
.sendToTarget();
}
}
}
(繼續閱讀...)
文章標籤

jeff810123 發表在 痞客邦 留言(0) 人氣(572)

  • 個人分類:Android API
▲top
  • 11月 03 週日 201314:07
  • CUI Windows Application和 GUI Windows Application的實現概論

今天我們要介紹CUI Windows Application和 GUI Windows Application分別如何實現,首先我們講到CUI Windows Application,CUI是Console User Interface的縮寫,是指像dos那樣在text mode下操控的介面,而在這樣的使用者界面模式下使用的程式稱為CUI Windows Application,程式的輸入輸出主要是直接以文字形式顯示在視窗中,但CUI Windows Application有其限制,因為他一開始設計就是要在dos下做執行,所以有些在dos能做的事在windows下就不能做像是直接對輸入輸出設備的暫存器做存取,這點在windows下是禁止的,因為windows有所謂的保護模式是不允許直接存取暫存器或是記憶體以免造成系統崩潰。CUI Windows Application的實現是最為容易,許多學校在教授C語言或java都是教授如何撰寫這種程式,所以這裡不多做贅述。至於GUI Windows Application,GUI是Graphic User Interface的縮寫,就是所謂的圖形化界面。那要撰寫GUI Windows Application可以透過C/C+++透過使用Windows API完成或是使用Visual Studio的windows form專案去完成,當然也可以透過java的Awt/Swing API去達成,當然也可以使用GTK或QT但那比較常在linux系統下使用,在windos要使用就比較麻煩。在這裡特別推薦使用MONO,他可以寫出跨平台的程式有興趣的朋友可以試試。That's all.XD
(繼續閱讀...)
文章標籤

jeff810123 發表在 痞客邦 留言(0) 人氣(68)

  • 個人分類:社團教學文摘錄
▲top
  • 1月 02 週三 201320:29
  • RS232傳輸(使用DMAR-128開發板,開發環境為AVR Studio)


這是用來練習如何在AVR單晶片上利用RS232傳輸,電腦端輸入數值傳送到開發板,透過七段顯示器顯示數值,程式碼如下:
#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/delay.h>
#include <string.h>
#include <stdio.h>
#define F_CPU 7372800
#define BAURDRATE 9600
#define UBRR_VALUE (unsigned char)((unsigned long)F_CPU/(16*(unsigned long)BAURDRATE)-1)
#define UBRR_VALUE_H (unsigned char)UBRR_VALUE>>8
#define UBRR_VALUE_L (unsigned char)UBRR_VALUE
#define D_LE0 PORTD &= ~(1 << PD4)
#define D_LE1 PORTD |= (1 << PD4)
#define W_LE0 PORTD &= ~(1 << PD5)
#define W_LE1 PORTD |= (1 << PD5)
#define DATA PORTA
#define SIZE 8
unsigned char str[SIZE];
unsigned char getstr[SIZE];
short int counter = -1;
void initialize(void);
void show_one(unsigned char,unsigned char);
void show(unsigned char[]);

void uart0Init(void)
{
UBRR0H = UBRR_VALUE_H;
UBRR0L = UBRR_VALUE_L;
UCSR0B = _BV(RXEN1) | _BV(RXCIE1) | _BV(TXEN1);
UCSR0C = _BV(UCSZ11) | _BV(UCSZ10);
}

SIGNAL(SIG_USART0_RECV)
{

//str[++counter] = UDR0;
//if (counter== 7)counter = -1;
getstr[++counter] = UDR0;
while(!(UCSR0A&_BV(UDRE1)));
UDR0=getstr[counter];
if (!getstr[counter] | getstr[counter] == (unsigned char)13) {
getstr[counter] = 0;
strcpy(str,getstr);
counter = -1;
}

}
int main(void)
{
initialize();
uart0Init();
sei();
while(1)
{
show(str);
}
return 0;
}
void show_one(unsigned char number,unsigned char place)
{
unsigned char pattern[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f,0x40,0x79};
D_LE1;
W_LE1;
DATA=~(0x01<<place);
W_LE0;
DATA=pattern[number];
D_LE0;
return;
}

void show(unsigned char seg7[])
{
unsigned char i;
for(i=0;seg7[i];i++)
{
show_one(seg7[i]-'0',SIZE-(strlen(seg7)-1-i)-1);
_delay_ms(1);
}
for(;i<SIZE;i++)
{
show_one(0,SIZE-i-1);
_delay_ms(1);
}
_delay_ms(1);
return;
}
void initialize(void)
{
DDRA=0XFF;
PORTA=0xFF;

DDRC=0XF0;
PORTC=0xF0;

DDRD=0XFF;
PORTD=0xFF;


}

(繼續閱讀...)
文章標籤

jeff810123 發表在 痞客邦 留言(0) 人氣(250)

  • 個人分類:AVR
▲top
  • 11月 17 週六 201216:38
  • OpenCV找球

因為實驗室老闆的要求及學長要我分擔他的任務,所以我花了一段時間去研究。對於要辨識的物體不外乎就是先做顏色的過濾,然後做二值化,接著再用膨脹,再接著高斯模糊,最後再用霍夫圓變換找出球,至於變換的成功度在於Canny運的閥值設定這部分只能慢慢微調XD,目前的程式碼如下:
#include <cv.h>
#include <highgui.h>
#include <cxcore.h>
#include <stdio.h>
#include <math.h>
void Sobel(IplImage*, IplImage*);
int main()
{
CvCapture *capture;
IplImage *src,*feature,*srcYcc,*featureYcc,*result;
CvPoint2D32f center;
CvMemStorage* storage = NULL;
CvMat *A=cvCreateMat(2,3,CV_32FC1);
CvSeq* circles = NULL;
float radius ;
capture =cvCaptureFromCAM(0) ;
cvNamedWindow("Webcam",0);
// cvNamedWindow("Webcam2",0);
float YRange[2],CrRange[2],CbRange[2];

while(TRUE)
{
int i,X_POS,Y_POS;
CvScalar color;
src = cvQueryFrame(capture);
srcYcc = cvCreateImage(cvGetSize(src) ,IPL_DEPTH_8U ,3);
result = cvCreateImage(cvGetSize(src) ,IPL_DEPTH_8U ,1);
feature = cvLoadImage("compare.jpg", CV_LOAD_IMAGE_COLOR);
featureYcc= cvCreateImage(cvGetSize(feature) ,IPL_DEPTH_8U ,3);

cvCvtColor(src,srcYcc, CV_BGR2YCrCb);
cvCvtColor(feature,featureYcc, CV_BGR2YCrCb);
for (Y_POS = 0; Y_POS < feature->height; Y_POS++) {
for (X_POS = 0; X_POS < feature->width; X_POS++) {
color = cvGet2D(featureYcc,Y_POS,X_POS);
if (Y_POS ==0 && X_POS ==0) {
YRange[0] = YRange[1] = color.val[0];
CrRange[0] = CrRange[1] = color.val[1];
CbRange[0] = CbRange[1] = color.val[2];
} else {
if (color.val[0] < YRange[0])YRange[0] = color.val[0];
if (color.val[0] > YRange[1])YRange[1] = color.val[0];
if (color.val[1] < CrRange[0])CrRange[0] = color.val[1];
if (color.val[1] > CrRange[1])CrRange[1] = color.val[1];
if (color.val[2] < CbRange[0])CbRange[0] = color.val[2];
if (color.val[2] > CbRange[1])CbRange[1] = color.val[2];
}
}
}
for (Y_POS = 0; Y_POS < srcYcc->height; Y_POS++) {
for (X_POS = 0; X_POS < srcYcc->width; X_POS++) {
color = cvGet2D(srcYcc,Y_POS,X_POS);
if (color.val[0]>YRange[0] && color.val[0]<YRange[1] &&
color.val[1]>CrRange[0] && color.val[1]<CrRange[1] &&
color.val[2]>CbRange[0] && color.val[2]<CbRange[1])
cvSet2D(result,Y_POS,X_POS,CV_RGB(255,255,255));
else
cvSet2D(result,Y_POS,X_POS,CV_RGB(0,0,0));
}
}
cvDilate(result,result,NULL,5);
cvSmooth(result,result,CV_GAUSSIAN,51,0,0,0);


storage = cvCreateMemStorage(0);
circles = cvHoughCircles(result, storage, CV_HOUGH_GRADIENT,1, 100, 50, 50,10,MAX (result->width, result->height));
for (i = 0; i < circles->total; i++ )
{
float* p = (float*)cvGetSeqElem(circles, i );
cvCircle(src, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );
}
cvShowImage("Webcam",src);
//cvShowImage("Webcam2",result);

if (cvWaitKey(10)>=0)
{
break;
}
}
cvReleaseCapture(&capture);
cvDestroyWindow("Webcam");
cvDestroyWindow("Webcam2");
cvReleaseImage(&src);
cvReleaseImage(&feature);
cvReleaseImage(&srcYcc);
cvReleaseImage(&featureYcc);
cvReleaseImage(&result);

}
void Sobel(IplImage* src, IplImage* dst)
{
double v1, v2, v;
int X_POS, Y_POS;
IplImage *H = cvCreateImage(cvGetSize(src), 32, 1);
IplImage *V = cvCreateImage(cvGetSize(src), 32, 1);
IplImage *HV = cvCreateImage(cvGetSize(src), 32, 1);
cvSobel(src,H,0,1,3);
cvSobel(src,V,1,0,3);
for (Y_POS = 0; Y_POS < src->height; Y_POS++) {
for (X_POS = 0; X_POS < src->width; X_POS++) {
v1 = cvGetReal2D(H, Y_POS, X_POS);
v2 = cvGetReal2D(V, Y_POS, X_POS);
v = sqrt(v1 * v1 + v2 * v2);
cvSetReal2D(HV,Y_POS,X_POS,v);
}
}
cvNormalize(HV,dst,0,255,CV_MINMAX,0);
cvReleaseImage(&H);
cvReleaseImage(&V);
cvReleaseImage(&HV);

}

(繼續閱讀...)
文章標籤

jeff810123 發表在 痞客邦 留言(0) 人氣(2,179)

  • 個人分類:OpenCV
▲top
  • 11月 10 週六 201211:40
  • Wav Player


前幾天心血來潮,想說用java寫個音樂撥放器於是就做了這個,在處理撥放動作是用DataSourceLine,把AudioInputStream的資料讀進來並寫到DataSourceLine,然後再利用他相關方法來控制播放,但他可以使用的方法太少,最後就改用Clip物件來做!
程式碼:
import java.awt.BorderLayout;
import java.awt.FileDialog;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import javax.swing.*;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

class MODE{final static int PLAY=0,PAUSE=1,STOP=2,REPLAY=3,OPEN=4;}
public class MediaPlayer implements ActionListener{
JFrame f;
JButton btnPlay, btnPause, btnStop, btnReplay, btnOpen;
JSlider sldTime;
JPanel p;
FileDialog flg;
AudioInputStream audioInputStream;
AudioFormat audioFormat;
Clip clip;
File file;
final String strCmd[]={"btnPlay","btnPause","btnStop","btnReplay","btnOpen"};
String filePath="";
Thread myThread;
public static void main(String [] arg)
{
new MediaPlayer();
}
public void AudioLoad()
{
filePath = flg.getDirectory()+flg.getFile();
f.setTitle(filePath);
if (clip != null)
clip.close();
clip = null;
audioInputStream = null;
file = null;
audioFormat = null;
file = new File(filePath);
try {
audioInputStream = AudioSystem.getAudioInputStream(file);
} catch (UnsupportedAudioFileException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
audioFormat = audioInputStream.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, audioFormat);
try {
clip = (Clip) AudioSystem.getLine(info);
clip.open(audioInputStream);
} catch (LineUnavailableException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
}

public MediaPlayer()
{
f = new JFrame("MyFrame");
p = new JPanel(new FlowLayout());
f.setLayout(new BorderLayout());
btnPlay = new JButton();
btnPause = new JButton();
btnStop = new JButton();
btnReplay = new JButton();
btnOpen = new JButton();
sldTime = new JSlider(0,100,0);

btnPlay.setIcon(new ImageIcon("./image/play.png"));
btnPause.setIcon(new ImageIcon("./image/pause.png"));
btnStop.setIcon(new ImageIcon("./image/stop.png"));
btnReplay.setIcon(new ImageIcon("./image/replay.png"));
btnOpen.setIcon(new ImageIcon("./image/open.png"));

btnPlay.setActionCommand("btnPlay");
btnPause.setActionCommand("btnPause");
btnStop.setActionCommand("btnStop");
btnReplay.setActionCommand("btnReplay");
btnOpen.setActionCommand("btnOpen");
btnPlay.addActionListener(this);
btnPause.addActionListener(this);
btnReplay.addActionListener(this);
btnStop.addActionListener(this);
btnOpen.addActionListener(this);
flg = new FileDialog(f, "開啟媒體檔", FileDialog.LOAD);
p.add(btnPlay);
p.add(btnPause);
p.add(btnStop);
p.add(btnReplay);
p.add(btnOpen);
f.add(p, BorderLayout.SOUTH);
f.add(sldTime, BorderLayout.NORTH);
f.pack();
f.setVisible(true);

}



@SuppressWarnings("deprecation")
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String cmd = e.getActionCommand();
int id = -1;
for (int i = 0; i <strCmd.length; i++)
if(strCmd[i] == cmd) id=i;
switch (id) {
case MODE.PLAY:
clip.start();
new Timer(1, new ActionListener(){

@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
sldTime.setMaximum((int) audioInputStream.getFrameLength());
sldTime.setValue(clip.getFramePosition());
}}).start();
break;
case MODE.PAUSE:
clip.stop();
break;
case MODE.STOP:
AudioLoad();
break;
case MODE.REPLAY:
AudioLoad();
clip.start();
break;
case MODE.OPEN:
flg.show();
if(!flg.getFile().equals("null"))
AudioLoad();

break;
default:
}


}
}
(繼續閱讀...)
文章標籤

jeff810123 發表在 痞客邦 留言(0) 人氣(113)

  • 個人分類:GUI
▲top
  • 9月 06 週四 201210:15
  • C語言呼叫dll


dll是Dynamic-link library的縮寫。dl的好處在於當程式呼叫到dll檔中的函式,才會把dll載入記憶體,所以節省了記憶體空間。因為當你用完後就可以free掉那 塊記憶體,不像一般在程式內部宣告的函數會一直佔用記憶體空間。使用dll還有一個好處,就是在程式中用到很多函數,如果將部份函數在dl中,程式的維護 會比較容易。
在C語言中,要呼叫dll要先熟悉函數指標,函數指標跟一般指標不同,在於他指向的不是一般型別而是函數。函數指標的宣告方式,跟函數原型的宣告差不多,宣告的形式為回傳值型別 (*函數指標變數名)(參數1型別,參數2型別,.....),在本例中我們是將函數指標定成一個新型別,宣告為 typedef void(*FuncPtr)(LPCTSTR),這樣在我們要用到這類型的函數指標,只要宣告成如 FuncPtr 指標變數名稱就 不用寫的落落長,這裡要注意的是你宣告的函數指標要能跟你要呼叫的dll中的函數能配對。宣告完指標接著,就是要利用Windows API中的LoadLibrary將dll載入獲取控制碼,然後再透過GetProcAddress取得dll中欲操作的函數位址,將宣告的函數指標指向 這個位址。然後就跟使用一般函數般使用函數指標,例如在本例中我是這樣使用myDllFunc(TEXT(\"Hello, World!\")),使用完記得用FreeLibrary將dll佔的記憶體free掉,大致上的操作流程是這樣。說了那麼多還是要看程式碼才會更容易了解。首先我們要先創一個dll檔,步驟如下(開發環境為Code::Block):
(1)開啟Code::Block(廢話XD
(2)File->New->Project,選Dynamic Link Library,按Go
(3)輸入Project名稱,Next
(4)這邊基本上不用更動,直接按Finish
(5)代碼
main.h部分
(繼續閱讀...)
文章標籤

jeff810123 發表在 痞客邦 留言(0) 人氣(7,162)

  • 個人分類:社團教學文摘錄
▲top
  • 8月 12 週日 201221:52
  • 透過AVIcap32.dll抓WebCam影像

最近實驗室要我們研究,兩隻手機透過wifi傳影像,我想說先試試用電腦跟平板對傳影像,所以就先處理電腦這端WebCam的程式,沒想到還蠻簡單的。主要是要熟悉C語言跟呼叫dll的部分,還有剪貼簿的操作。
程式碼如下:
#include<windows.h>
#define ID_MYTIMER 100
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE hInst, int);
BOOL LoadWebCamAPI(void);


TCHAR szClassName[] = TEXT("WebCam");
INT_PTR (*CapturePicture)(LPSTR, int, int, int, int, int, INT_PTR, int);
INT_PTR intDeviceHandle;
LPSTR baDeviceName;

const int WM_CAP_DRIVER_CONNECT = 0x40a;
const int WM_CAP_DRIVER_DISCONNECT = 0x40b;
const int WM_CAP_EDIT_COPY = 0x41e;

const int WM_CAP_GRAB_FRAME = 0x43c;

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
MSG msg;
BOOL bRet;

if (!InitApp(hCurInst))
return FALSE;
if (!InitInstance(hCurInst, nCmdShow))
return FALSE;

while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
{
if (bRet == -1)
break;
else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}

}
return 0;
}

ATOM InitApp(HINSTANCE hInst)
{
WNDCLASSEX wc;

wc.style = CS_VREDRAW | CS_HREDRAW;

wc.cbSize = sizeof(WNDCLASSEX);
wc.cbWndExtra = 0;
wc.cbClsExtra = 0;

wc.lpfnWndProc = WndProc;
wc.lpszClassName = szClassName;
wc.lpszMenuName = NULL;

wc.hInstance = hInst;
wc.hIcon = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hIconSm = NULL;
wc.hCursor = (HCURSOR)LoadImage(NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

return (RegisterClassEx(&wc));
}

BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
HWND hWnd = CreateWindow(szClassName,
TEXT("WebCam"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInst,
NULL);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
PAINTSTRUCT ps;
HDC hdc, mdc;
HGLOBAL hmem;
RECT rc;
HBITMAP hbmp;
switch (msg) {
case WM_CREATE:
SetTimer(hWnd, ID_MYTIMER, 1, NULL);
if (!LoadWebCamAPI())
{
MessageBox(hWnd, TEXT("Error!"), TEXT("AVIcap32.dll加載失敗!"), MB_YESNO | MB_ICONQUESTION);
PostQuitMessage(0);
} else {
intDeviceHandle = (CapturePicture)(baDeviceName, WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, (INT_PTR)hWnd, 0);
SendMessage(intDeviceHandle, WM_CAP_DRIVER_CONNECT, 0, 0);
MessageBox( hWnd, TEXT("Success!"), TEXT("AVIcap32.dll加載成功!"), MB_OK);
}
break;
case WM_TIMER:

InvalidateRect(hWnd, NULL, FALSE);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
mdc = CreateCompatibleDC(hdc);
if (SendMessage(intDeviceHandle, WM_CAP_GRAB_FRAME, 0, 0) > 0) //如果有截取到畫面
{
if (SendMessage(intDeviceHandle, WM_CAP_EDIT_COPY, 0, 0) > 0) //如果有Copy到剪貼簿
{
OpenClipboard (hWnd) ;
hbmp = GetClipboardData(CF_BITMAP);
SelectObject(mdc, hbmp);
GetClipBox(mdc, &rc);
BitBlt(hdc, 0, 0, rc.right, rc.bottom, mdc,0, 0, SRCCOPY);
CloseClipboard();
}
}


EndPaint(hWnd, &ps);
DeleteObject(hbmp);
DeleteDC(mdc);
break;
case WM_DESTROY:
KillTimer(hWnd, ID_MYTIMER);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, msg, wp, lp);
}

return 0;
}

BOOL LoadWebCamAPI(void)
{
HMODULE hInst;

hInst = LoadLibrary("AVIcap32.dll");
if (hInst == NULL)
return FALSE;
CapturePicture = GetProcAddress(hInst, "capCreateCaptureWindowA");
if (CapturePicture == NULL)
return FALSE;
return TRUE;
}
(繼續閱讀...)
文章標籤

jeff810123 發表在 痞客邦 留言(0) 人氣(1,167)

  • 個人分類:Windows API
▲top
  • 8月 01 週三 201221:33
  • 索貝爾算子

豌豆荚截图20120801214411
之前用WindowsAPI寫顯示經由索貝爾算子運算後的點陣圖,這次改用Android程式顯示圖片。運算的方法是一樣,這邊我是定一個myView類別,繼承View,用來處理、顯示圖片。主要要了解的東西有索貝爾算子、Bitmap類別,還有一維陣列當二維陣列用的概念,然後我直接用myView類別產生的物件當做Activity的容器,所以沒動到layout部分。
程式碼如下
MainActivity.java
(繼續閱讀...)
文章標籤

jeff810123 發表在 痞客邦 留言(0) 人氣(247)

  • 個人分類:Android API
▲top
  • 7月 30 週一 201222:20
  • Sobel算子


事實上索貝爾運算子我之前就有想說要研究,但看到維基百科上的解釋,讓我打退堂鼓。最近有開始研究他,也多虧同學的講義讓我終 於了解,其中要了解的是捲積的概念,還有邊界判定的問題,其他應該都小Case。
程式碼如下:
Sobel.rc
(繼續閱讀...)
文章標籤

jeff810123 發表在 痞客邦 留言(0) 人氣(699)

  • 個人分類:Windows API
▲top
  • 4月 11 週三 201222:16
  • 字串串接

哈哈!人的野心總是不能滿足!之前上資料結構,老師叫我們做三個字串串接,是用迴圈做的。我剛好有讀到關於指標陣列的東西,所以改用指標陣列來做。 過程十分順利,之後我又有更大的企圖心,如果要串接的字串數量是可以變化要怎做?就像printf那樣,所以我就去查資料啦!是利用到Stdarg.h中的,提供使用不定參數的函式,看完資料後就迅速完成,但這之中,我又耍笨了!一直以為我做錯,還跑去知識加發問。後面才發現是誤會一場,哈!完成的原始碼如下:
#include<stdio.h>

#include<stdlib.h>

#include<stdarg.h>



void cat(int amont,char [],...);

int main(void)

{

char strA[256];

char strB[256];

char strC[256];

char strD[256];

scanf("%s %s %s",strA,strB,strC);

cat(3,strD,strA,strB,strC);

printf("%s\n",strD);

system("PAUSE");

return 0;

}

void cat(int amount,char dest[],...)

{

char *ptr[amount];

va_list argptr;

va_start(argptr,amount);

int i,counter=0;

for (i=0;i<amount;i++)

{

ptr[i]=va_arg(argptr,char *);

while (*ptr[i]!='\0')

dest[counter++]=*(ptr[i]++);

}

dest[counter]='\0';

va_end(argptr);

}
(繼續閱讀...)
文章標籤

jeff810123 發表在 痞客邦 留言(0) 人氣(114)

  • 個人分類:Console
▲top
12»

我的FB

個人資訊

jeff810123
暱稱:
jeff810123
分類:
數位生活
好友:
累積中
地區:

熱門文章

  • (113)Wav Player

文章分類

toggle Java (2)
  • Console (2)
  • GUI (1)
toggle Android (1)
  • Android API (3)
toggle 單晶片 (1)
  • AVR (1)
toggle C語言 (4)
  • OpenCV (1)
  • Windows API (2)
  • Console (1)
  • OpenGlut (1)
  • 社團教學文摘錄 (2)
  • 未分類文章 (1)

最新文章

  • BluetoothChatService改良
  • CUI Windows Application和 GUI Windows Application的實現概論
  • RS232傳輸(使用DMAR-128開發板,開發環境為AVR Studio)
  • OpenCV找球
  • Wav Player
  • C語言呼叫dll
  • 透過AVIcap32.dll抓WebCam影像
  • 索貝爾算子
  • Sobel算子
  • 字串串接

最新留言

  • [18/04/11] one 於文章「Java作業-帕斯卡三角形 ...」留言:
    厲害 啊 大師...

文章精選

文章搜尋

誰來我家

參觀人氣

  • 本日人氣:
  • 累積人氣: