1
0
Fork 0
mirror of https://github.com/ruby-opencv/ruby-opencv synced 2023-03-27 23:22:12 -04:00

added CvVideoWriter (not fully tested)

This commit is contained in:
ser1zw 2011-06-11 02:46:52 +09:00
parent bff95e942a
commit aae092dc04
5 changed files with 75 additions and 13 deletions

View file

@ -29,7 +29,7 @@ rb_class()
void void
define_ruby_class() define_ruby_class()
{ {
if(rb_klass) if (rb_klass)
return; return;
/* /*
* opencv = rb_define_module("OpenCV"); * opencv = rb_define_module("OpenCV");
@ -45,8 +45,8 @@ define_ruby_class()
/* /*
* call-seq: * call-seq:
* CvVideoWriter.new(<i>filanem, fourcc, fps, size</i>) -> cvvideowriter * CvVideoWriter.new(<i>filname, fourcc, fps, size[, is_color]</i>) -> cvvideowriter
* CvVideoWriter.new(<i>filanem, fourcc, fps, size</i>){|vw| ... } -> nil * CvVideoWriter.new(<i>filname, fourcc, fps, size[, is_color]</i>){|vw| ... } -> nil
* *
* Open new video writer. If block given, writer is closed automatically when end of block. * Open new video writer. If block given, writer is closed automatically when end of block.
* *
@ -55,8 +55,8 @@ define_ruby_class()
VALUE VALUE
rb_initialize(int argc, VALUE *argv, VALUE self) rb_initialize(int argc, VALUE *argv, VALUE self)
{ {
VALUE filename, fourcc, fps, size; VALUE filename, fourcc, fps, size, is_color_val;
rb_scan_args(argc, argv, "40", &filename, &fourcc, &fps, &size); rb_scan_args(argc, argv, "41", &filename, &fourcc, &fps, &size, &is_color_val);
char codec[4] = {' ', ' ', ' ', ' '}; char codec[4] = {' ', ' ', ' ', ' '};
int codec_number; int codec_number;
Check_Type(filename, T_STRING); Check_Type(filename, T_STRING);
@ -69,19 +69,27 @@ rb_initialize(int argc, VALUE *argv, VALUE self)
if (RSTRING_LEN(fourcc) > 4) if (RSTRING_LEN(fourcc) > 4)
rb_raise(rb_eStandardError, "argument 2 (fourcc) should be specific 4-character. (i.e \"PIM1\",\"MJPG\")"); rb_raise(rb_eStandardError, "argument 2 (fourcc) should be specific 4-character. (i.e \"PIM1\",\"MJPG\")");
else { 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[i] = RSTRING_PTR(fourcc)[i];
codec_number = CV_FOURCC(codec[0], codec[1], codec[2], codec[3]); 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()) { if (rb_block_given_p()) {
rb_yield(self); rb_yield(self);
rb_close(self); rb_close(self);
return Qnil; return Qnil;
} else {
return self;
} }
else
return self;
} }
/* /*
@ -107,7 +115,8 @@ VALUE
rb_close(VALUE self) rb_close(VALUE self)
{ {
CvVideoWriter *writer = CVVIDEOWRITER(self); CvVideoWriter *writer = CVVIDEOWRITER(self);
cvReleaseVideoWriter(&writer); if (writer)
cvReleaseVideoWriter(&writer);
return Qnil; return Qnil;
} }

View file

@ -31,9 +31,11 @@ __NAMESPACE_END_CVVIDEOWRITER
inline CvVideoWriter* inline CvVideoWriter*
CVVIDEOWRITER(VALUE object) CVVIDEOWRITER(VALUE object)
{ {
CvVideoWriter *ptr; // CvVideoWriter is
Data_Get_Struct(object, CvVideoWriter, ptr); // CvVideoWriter *ptr;
return ptr; // Data_Get_Struct(object, CvVideoWriter, ptr);
// return ptr;
return (CvVideoWriter*)DATA_PTR(object);
} }
__NAMESPACE_END_OPENCV __NAMESPACE_END_OPENCV

View file

@ -765,6 +765,7 @@ extern "C"{
mOpenCV::cCvSparseMat::define_ruby_class(); mOpenCV::cCvSparseMat::define_ruby_class();
mOpenCV::cCvHistogram::define_ruby_class(); mOpenCV::cCvHistogram::define_ruby_class();
mOpenCV::cCvCapture::define_ruby_class(); mOpenCV::cCvCapture::define_ruby_class();
mOpenCV::cCvVideoWriter::define_ruby_class();
mOpenCV::cCvLine::define_ruby_class(); mOpenCV::cCvLine::define_ruby_class();
mOpenCV::cCvTwoPoints::define_ruby_class(); mOpenCV::cCvTwoPoints::define_ruby_class();

View file

@ -115,6 +115,7 @@ extern "C"{
#include "cvsparsemat.h" #include "cvsparsemat.h"
#include "cvhistogram.h" #include "cvhistogram.h"
#include "cvcapture.h" #include "cvcapture.h"
#include "cvvideowriter.h"
#include "cvline.h" #include "cvline.h"
#include "cvtwopoints.h" #include "cvtwopoints.h"

49
test/test_cvvideowriter.rb Executable file
View file

@ -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