• 카테고리

    질문 & 답변
  • 세부 분야

    컴퓨터 비전

  • 해결 여부

    해결됨

웹캠 그레이 적용 결과 저장

20.03.04 01:10 작성 조회수 260

0

안녕하세요, 동영상 저장관련입니다. 웹캠의 동영상을 타이머1에서  색상변환 클래스 메소드를 이용하여 실시간 결과물 출력까지는 되는데, 다중 저장시 원본으로 저장됩니다. 타이어2의  WriteFrame(src)을 어떻게 작성해야 결과물을 받아와서 저장할 수 있는지요? 감사합니다.

답변 5

·

답변을 작성해보세요.

1

CvtColor ColorConversion.BgrToGray로 진행하면 채널이 1개가 됩니다.

-> gray = new IplImage(src.Size, BitDepth.U8, 1);

그레이스케일 이후, 다시 색상으로 변경해서 저장해보시길 바랍니다.

resrc 변수의 채널이 3채널이여야 합니다.

color = new IplImage(src.Size, BitDepth.U8, 3);

ColorConversion.GrayToBgr

1

안녕하세요 . DK L님

원본으로 저장된다는 말씀이 다중 저장이 되지 않고, 원본 동영상이 그대로 저장된다는 말씀이 맞나요?

다중 저장시, 녹화에 필요한 클래스를 선언하고, 타이머에서 해당 클래스에 프레임을 기록해야합니다.

만약, 원본이 그대로 저장된다면 CvVideoWriter의 선언이나 초기화가 어느 부분에서 작동하고 있는지 확인이 필요할 것 같습니다.

녹화 순서는 다음과 같습니다.

CvVideoWriter 초기화 -> 타이머시간마다 WriteFrame -> 녹화 종료시, 클래스 메모리 해제 순서입니다.

아마, 원본이 저장된다고 하시면 클래스 초기화를 전역 쪽에서 생성하셨을 것 같습니다.

https://076923.github.io/posts/C-opencv-19/

이 부분을 한 번 참고해보시길 바랍니다. 감사합니다.

0

DK L님의 프로필

DK L

질문자

2020.03.04

아, 해결되었습니다. 정말 감사드립니다!!

0

DK L님의 프로필

DK L

질문자

2020.03.04

안녕하세요, 해당 강좌를 여러번 보고 아래처럼 코드를 작성했습니다. 전역변수로 IplImg를 하나 더 만들어서(resrc),  두번째 이미지에 변환 클래스를 적용했습니다.그런데, 저장된 녹화 파일을 열어보면 형식에러가 나고, 용량도 6kb 밖에 안되네요. 폼 창에서는 원본과 변환 이미지가 모두 보이긴 합니다. 문법 오류라 찾아보면서 시도해보았는데, 막혀버렸습니다. 아래 작성된 코드 문제 좀 검토 부탁드립니다.  감사합니다.

using System;
using System.Windows.Forms;
using OpenCvSharp;

namespace CVcamera
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        CvCapture capture;      
        IplImage src;  
        IplImage resrc;
        CvVideoWriter OpenCV_video;

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                capture = CvCapture.FromCamera(CaptureDevice.DShow, 1);
                capture.SetCaptureProperty(CaptureProperty.FrameWidth, 640);
                capture.SetCaptureProperty(CaptureProperty.FrameHeight, 480);
  
            }
            catch
            {
                timer1.Enabled = false;
            }
        }

      

        private void timer1_Tick(object sender, EventArgs e)
        {
            src = capture.QueryFrame();

            OPCV_Class Convert = new OPCV_Class();
            resrc = Convert.GrayScale(src);

            pictureBoxIpl2.ImageIpl = src;
            pictureBoxIpl3.ImageIpl = resrc;

        }

        private void timer2_Tick(object sender, EventArgs e)
        {
           
            OpenCV_video.WriteFrame(resrc);
        }

        private void button1_Click(object sender, EventArgs e)
        {
          
            string save_name = DateTime.Now.ToString("yyyy-MM-dd-hhmmss");
            OpenCV_video = new CvVideoWriter("../../" + save_name + ".avi", "XVID", 15, Cv.GetSize(resrc));

            timer2.Enabled = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            timer2.Enabled = false;
        }


        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            Cv.ReleaseImage(src);
            if (src != null) src.Dispose();
            Cv.ReleaseImage(resrc);
            if (resrc != null) src.Dispose();
        }

      
    }
}

0

DK L님의 프로필

DK L

질문자

2020.03.04

감사합니다! 오늘 실행해보고 파드백드리겠습니다.