From aae092dc046045f1c34cc8e735a3e5db3a574630 Mon Sep 17 00:00:00 2001 From: ser1zw Date: Sat, 11 Jun 2011 02:46:52 +0900 Subject: [PATCH] added CvVideoWriter (not fully tested) --- ext/opencv/cvvideowriter.cpp | 29 +++++++++++++-------- ext/opencv/cvvideowriter.h | 8 +++--- ext/opencv/opencv.cpp | 1 + ext/opencv/opencv.h | 1 + test/test_cvvideowriter.rb | 49 ++++++++++++++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 13 deletions(-) create mode 100755 test/test_cvvideowriter.rb diff --git a/ext/opencv/cvvideowriter.cpp b/ext/opencv/cvvideowriter.cpp index 5652062..5da590b 100644 --- a/ext/opencv/cvvideowriter.cpp +++ b/ext/opencv/cvvideowriter.cpp @@ -29,7 +29,7 @@ rb_class() void define_ruby_class() { - if(rb_klass) + if (rb_klass) return; /* * opencv = rb_define_module("OpenCV"); @@ -45,8 +45,8 @@ define_ruby_class() /* * call-seq: - * CvVideoWriter.new(filanem, fourcc, fps, size) -> cvvideowriter - * CvVideoWriter.new(filanem, fourcc, fps, size){|vw| ... } -> nil + * CvVideoWriter.new(filname, fourcc, fps, size[, is_color]) -> cvvideowriter + * CvVideoWriter.new(filname, fourcc, fps, size[, is_color]){|vw| ... } -> nil * * Open new video writer. If block given, writer is closed automatically when end of block. * @@ -55,8 +55,8 @@ define_ruby_class() VALUE rb_initialize(int argc, VALUE *argv, VALUE self) { - VALUE filename, fourcc, fps, size; - rb_scan_args(argc, argv, "40", &filename, &fourcc, &fps, &size); + VALUE filename, fourcc, fps, size, is_color_val; + rb_scan_args(argc, argv, "41", &filename, &fourcc, &fps, &size, &is_color_val); char codec[4] = {' ', ' ', ' ', ' '}; int codec_number; Check_Type(filename, T_STRING); @@ -69,19 +69,27 @@ rb_initialize(int argc, VALUE *argv, VALUE self) if (RSTRING_LEN(fourcc) > 4) rb_raise(rb_eStandardError, "argument 2 (fourcc) should be specific 4-character. (i.e \"PIM1\",\"MJPG\")"); else { - for (int i = 0; i < RSTRING_LEN(fourcc); i++) + int len = RSTRING_LEN(fourcc); + for (int i = 0; i < len; ++i) codec[i] = RSTRING_PTR(fourcc)[i]; codec_number = CV_FOURCC(codec[0], codec[1], codec[2], codec[3]); } } - DATA_PTR(self) = cvCreateVideoWriter(StringValueCStr(filename), codec_number, FIX2INT(fps), VALUE_TO_CVSIZE(size)); + int is_color; + if (NIL_P(is_color_val)) + is_color = 1; + else + is_color = (is_color_val == Qtrue) ? 1 : 0; + + DATA_PTR(self) = cvCreateVideoWriter(StringValueCStr(filename), codec_number, + NUM2DBL(fps), VALUE_TO_CVSIZE(size), is_color); if (rb_block_given_p()) { rb_yield(self); rb_close(self); return Qnil; - } else { - return self; } + else + return self; } /* @@ -107,7 +115,8 @@ VALUE rb_close(VALUE self) { CvVideoWriter *writer = CVVIDEOWRITER(self); - cvReleaseVideoWriter(&writer); + if (writer) + cvReleaseVideoWriter(&writer); return Qnil; } diff --git a/ext/opencv/cvvideowriter.h b/ext/opencv/cvvideowriter.h index 0f0a788..048d58e 100644 --- a/ext/opencv/cvvideowriter.h +++ b/ext/opencv/cvvideowriter.h @@ -31,9 +31,11 @@ __NAMESPACE_END_CVVIDEOWRITER inline CvVideoWriter* CVVIDEOWRITER(VALUE object) { - CvVideoWriter *ptr; - Data_Get_Struct(object, CvVideoWriter, ptr); - return ptr; + // CvVideoWriter is + // CvVideoWriter *ptr; + // Data_Get_Struct(object, CvVideoWriter, ptr); + // return ptr; + return (CvVideoWriter*)DATA_PTR(object); } __NAMESPACE_END_OPENCV diff --git a/ext/opencv/opencv.cpp b/ext/opencv/opencv.cpp index 3e8d737..0bf5cc8 100644 --- a/ext/opencv/opencv.cpp +++ b/ext/opencv/opencv.cpp @@ -765,6 +765,7 @@ extern "C"{ mOpenCV::cCvSparseMat::define_ruby_class(); mOpenCV::cCvHistogram::define_ruby_class(); mOpenCV::cCvCapture::define_ruby_class(); + mOpenCV::cCvVideoWriter::define_ruby_class(); mOpenCV::cCvLine::define_ruby_class(); mOpenCV::cCvTwoPoints::define_ruby_class(); diff --git a/ext/opencv/opencv.h b/ext/opencv/opencv.h index 8948c55..5645818 100644 --- a/ext/opencv/opencv.h +++ b/ext/opencv/opencv.h @@ -115,6 +115,7 @@ extern "C"{ #include "cvsparsemat.h" #include "cvhistogram.h" #include "cvcapture.h" +#include "cvvideowriter.h" #include "cvline.h" #include "cvtwopoints.h" diff --git a/test/test_cvvideowriter.rb b/test/test_cvvideowriter.rb new file mode 100755 index 0000000..5eee002 --- /dev/null +++ b/test/test_cvvideowriter.rb @@ -0,0 +1,49 @@ +#!/usr/bin/env ruby +# -*- mode: ruby; coding: utf-8-unix -*- +require 'test/unit' +require 'opencv' +require File.expand_path(File.dirname(__FILE__)) + '/helper' + +include OpenCV + +# Tests for OpenCV::CvVideoWriter +class TestCvVideoWriter < OpenCVTestCase + def test_initialize + vw = CvVideoWriter.new('foo.avi', 'MJPG', 15, CvSize.new(320, 240)) + assert_equal(CvVideoWriter, vw.class) + vw.close + + vw = CvVideoWriter.new('foo.avi', 'MJPG', 15, CvSize.new(320, 240), false) + assert_equal(CvVideoWriter, vw.class) + vw.close + + ## Supported only Windows(?) + # vw = CvVideoWriter.new('foo.avi', nil, 15, CvSize.new(320, 240), false) + # assert_equal(CvVideoWriter, vw.class) + # vw.close + + CvVideoWriter.new('foo.avi', 'MJPG', 15, CvSize.new(320, 240)) { |vw| + assert_equal(CvVideoWriter, vw.class) + } + + assert_raise(TypeError) { + vw = CvVideoWriter.new(123, 'MJPG', 15, CvSize.new(320, 240), false) + } + end + + def test_write + vw = CvVideoWriter.new('foo.avi', 'MJPG', 15, CvSize.new(256, 256)) + vw.write CvMat.load(FILENAME_LENA256x256) + vw.close + + CvVideoWriter.new('foo.avi', 'MJPG', 15, CvSize.new(256, 256)) { |vw| + vw.write CvMat.load(FILENAME_LENA256x256) + } + end + + def test_close + vw = CvVideoWriter.new('foo.avi', 'MJPG', 15, CvSize.new(320, 240)) + vw.close + end +end +