728x90
๋ฐ์ํ
1. ํ๋ก์ ํธ ์์ฑ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
- Visual Studio์์ Windows Forms App (.NET Framework) ํ๋ก์ ํธ๋ฅผ ์๋ก ์์ฑํฉ๋๋ค.
- NuGet ํจํค์ง ๊ด๋ฆฌ๋ฅผ ํตํด AForge.Video์ AForge.Video.DirectShow ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํฉ๋๋ค.
- AForge.Video๋ ๊ธฐ๋ณธ ๋น๋์ค ๊ด๋ จ ์์ ์ ์ง์ํ๊ณ ,
- AForge.Video.DirectShow๋ ์น์บ ๊ณผ ๊ฐ์ ๋น๋์ค ์ฅ์น์ ์ฐ๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- AForge ์ค์น ๋ฐฉ๋ฒ
- ๋๊ตฌ > NuGet ํจํค์ง ๊ด๋ฆฌ์ > ์๋ฃจ์ ์ฉ NuGet ํจํค์ง ๊ด๋ฆฌ ๋ฉ๋ด๋ก ์ด๋ํฉ๋๋ค.
- AForge.Video์ AForge.Video.DirectShow๋ฅผ ๊ฒ์ํ์ฌ ์ค์นํฉ๋๋ค.
2. UI ๊ตฌ์ฑ ๋ฐ ์ฝ๋ ์์ฑ
- Form ๋์์ธ ์ฐฝ์์PictureBox์ Button์ ์ถ๊ฐํฉ๋๋ค.
- PictureBox๋ ์น์บ ์ ์ค์๊ฐ ๋น๋์ค๋ฅผ ํ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- Button์ ์ฌ์ง์ ์บก์ฒํ๊ณ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
- ๊ฐ ์ปจํธ๋กค์ ์ด๋ฆ์ ์ง์ ํด์ค๋๋ค.
- PictureBox ์ด๋ฆ์ pictureBox1๋ก ์ค์ ํฉ๋๋ค.
- Button ์ด๋ฆ์ captureButton์ผ๋ก, ํ ์คํธ๋ "Capture"๋ก ์ค์ ํฉ๋๋ค.
- UI ๊ตฌ์ฑ ์ฝ๋๋ฅผ Form1.Designer.cs ํ์ผ์ ์์ฑํด์ผ ํฉ๋๋ค.
- ์ฌ๊ธฐ์๋ PictureBox์ Button์ ์ถ๊ฐํ๊ณ , ์์น์ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๋ ์ฝ๋ ์์๋ฅผ ์ ๊ณตํ๊ฒ ์ต๋๋ค.
namespace WebcamCaptureApp
{
partial class Form1
{
private System.ComponentModel.IContainer components = null;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Button captureButton;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.captureButton = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// pictureBox1
//
this.pictureBox1.Location = new System.Drawing.Point(12, 12);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(640, 480); // Width: 640, Height: 480
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.pictureBox1.TabIndex = 0;
this.pictureBox1.TabStop = false;
//
// captureButton
//
this.captureButton.Location = new System.Drawing.Point(280, 500); // Centered below the picture box
this.captureButton.Name = "captureButton";
this.captureButton.Size = new System.Drawing.Size(100, 40);
this.captureButton.TabIndex = 1;
this.captureButton.Text = "Capture";
this.captureButton.UseVisualStyleBackColor = true;
this.captureButton.Click += new System.EventHandler(this.captureButton_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(664, 561); // Form width and height
this.Controls.Add(this.captureButton);
this.Controls.Add(this.pictureBox1);
this.Name = "Form1";
this.Text = "Webcam Capture App";
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
}
}
}
3. ๊ธฐ๋ฅ ๋ก์ง ์ฝ๋ ์์ฑ
๋ค์ ์ฝ๋๋ฅผ Form1.cs ํ์ผ์ ์์ฑํ์ฌ ์น์บ ์์ ์ด๋ฏธ์ง๋ฅผ ์บก์ฒํ๊ณ ๋ก์ปฌ์ ์ ์ฅํฉ๋๋ค.
using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.DirectShow;
namespace WebcamCaptureApp
{
public partial class Form1 : Form
{
private FilterInfoCollection videoDevices;
private VideoCaptureDevice videoSource;
public Form1()
{
InitializeComponent();
Load += Form1_Load;
FormClosing += Form1_FormClosing;
}
private void Form1_Load(object sender, EventArgs e)
{
// ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋น๋์ค ์ฅ์น(์น์บ ) ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if (videoDevices.Count == 0)
{
MessageBox.Show("์น์บ ์ ์ฐพ์ ์ ์์ต๋๋ค.");
return;
}
// ์ฒซ ๋ฒ์งธ ์น์บ ์ ํ
videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
videoSource.NewFrame += new NewFrameEventHandler(VideoSource_NewFrame);
videoSource.Start();
}
private void VideoSource_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
// PictureBox์ ํ์ฌ ํ๋ ์ ํ์
Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();
pictureBox1.Image = bitmap;
}
private void captureButton_Click(object sender, EventArgs e)
{
// PictureBox์ ํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์บก์ฒํ์ฌ ์ ์ฅ
if (pictureBox1.Image != null)
{
string directoryPath = @"C:\Images";
Directory.CreateDirectory(directoryPath);
string filePath = Path.Combine(directoryPath, $"capture_{DateTime.Now:yyyyMMdd_HHmmss}.jpg");
pictureBox1.Image.Save(filePath, System.Drawing.Imaging.ImageFormat.Jpeg);
MessageBox.Show($"์ด๋ฏธ์ง๊ฐ {filePath}์ ์ ์ฅ๋์์ต๋๋ค.");
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// ํผ ์ข
๋ฃ ์ ์นด๋ฉ๋ผ ์คํธ๋ฆผ ์ ์ง ๋ฐ ํด์
if (videoSource != null && videoSource.IsRunning)
{
videoSource.SignalToStop();
videoSource.WaitForStop();
}
}
}
}
- Form1_Load
- ์ฐ๊ฒฐ๋ ๋ชจ๋ ์น์บ ์ฅ์น ๋ชฉ๋ก์ ๊ฐ์ ธ์ต๋๋ค.
- ์ฌ์ฉ ๊ฐ๋ฅํ ์ฒซ ๋ฒ์งธ ์น์บ ์ฅ์น๋ฅผ videoSource๋ก ์ค์ ํ๊ณ , ์๋ก์ด ํ๋ ์์ด ๋ค์ด์ฌ ๋๋ง๋ค VideoSource_NewFrame ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํฉ๋๋ค.
- VideoSource_NewFrame
- ์น์บ ์ ์๋ก์ด ํ๋ ์์ PictureBox์ ํ์ํ์ฌ ์ค์๊ฐ ๋น๋์ค ์คํธ๋ฆผ์ ์ ๊ณตํฉ๋๋ค.
- captureButton_Click
- ํ์ฌ PictureBox์ ์ด๋ฏธ์ง๋ฅผ ์บก์ฒํ์ฌ C:\Images ํด๋์ ์ ์ฅํฉ๋๋ค.
- ์ ์ฅ ํ์ผ์ ์ด๋ฆ์ ํ์ฌ ์๊ฐ(yyyyMMdd_HHmmss ํ์)์ ์ฌ์ฉํด ์ ๋ํฌํ๊ฒ ๋ง๋ญ๋๋ค.
- Form1_FormClosing
- ํผ์ด ๋ซํ ๋ ์น์บ ์คํธ๋ฆผ์ ์ ์งํ์ฌ ์์์ ํด์ ํฉ๋๋ค.
4. ํ๋ก๊ทธ๋จ ์คํ ๋ฐ ํ ์คํธ
- ํ๋ก์ ํธ๋ฅผ ์คํํ๋ฉด ์น์บ ์์ ๋น๋์ค ์คํธ๋ฆผ์ด PictureBox์ ์ค์๊ฐ์ผ๋ก ํ์๋ฉ๋๋ค.
- Capture ๋ฒํผ์ ํด๋ฆญํ๋ฉด ํ์ฌ ํ๋ฉด์ ์บก์ฒํ์ฌ C:\Images์ JPEG ํ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
์น์บ ์ผ๋ก ์ฌ์ง ์ดฌ์
์ง์ ๊ฒฝ๋ก์ ์ ์ฅ๋ ์ฌ์ง
์ ์ฅ๋ ์ฌ์ง ํ์ธ
728x90
๋ฐ์ํ
'๐ Development > C#' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C# .net] Windows ์๊ฒฉ ์ฆ๋ช ๊ด๋ฆฌ์ ๋ก๊ทธ์ธ ๋ฐฉ๋ฒ (0) | 2024.12.11 |
---|---|
[C#] ๋ค์์คํ์ด์ค(namespace) ๋? (3) | 2024.11.20 |
[C#] GDI+ (Graphics Device Interface Plus) ๋? (1) | 2024.11.19 |
C#๊ณผ .NET ๊ด๊ณ, ์ฝ๊ฒ ์ดํดํ๊ธฐ (2) | 2024.11.11 |