8bit RGB⇔YUV422変換

Perlで作ってみた。YUV422の並びは、Y0 Y1 U V ...


#!/usr/bin/perl -w

use strict;
use warnings;
use Getopt::Std;

my %opt = ();
getopts("hr:y:", \%opt);
if ($opt{h}) { &help(); }
if ($opt{r}) { &rgb_2_yuv422(); }
if ($opt{y}) { &yub422_2_rgb(); }

sub help {
print << "ENDLINE";
Usage: ${0} [Optin]
Option:
-h :help
-r arg :rgb2yuv
-y arg :yub2rgb
ENDLINE
}

sub rgb_2_yuv422 {
my $infile = "$opt{r}";
my $outfile = "$opt{r}.yuv";
open (INFILE, "<$infile") || die "$infile: $!";
open (OUTFILE, ">$outfile") || die "$outfile: $!";
binmode INFILE;
binmode OUTFILE;

my $coun = 0;
my $buff;
my $r; my $g; my $b;
my $y; my $u; my $v;
my @y; my @u; my @v;
while (read(INFILE, $buff, 1)) {
my $val = unpack("C1", $buff);

if ($coun == 0 || $coun == 3) {
$r = $val;

$coun++;
}
elsif ($coun == 1 || $coun == 4) {
$g = $val;

$coun++;
}
elsif ($coun == 2 || $coun == 5) {
$b = $val;

$y = 0.299*$r + 0.587*$g + 0.114*$b;
$u = -0.169*$r - 0.331*$g + 0.500*$b + 128;
$v = 0.500*$r - 0.419*$g - 0.081*$b + 128;

$y = &lotate($y, 255);
$u = &lotate($u, 255);
$v = &lotate($v, 255);

if ($coun == 2) {
$y[0] = $y;
$u[0] = $u;
$v[0] = $v;

$coun++;
}
else {
$y[1] = $y;

$val = pack("C1", $y[0]); print OUTFILE $val;
$val = pack("C1", $y[1]); print OUTFILE $val;
$val = pack("C1", $u[0]); print OUTFILE $val;
$val = pack("C1", $v[0]); print OUTFILE $val;

$coun = 0;
}
}
}

}

sub yub422_2_rgb {
my $infile = "$opt{y}";
my $outfile = "$opt{y}.rgb";
open (INFILE, "<$infile") || die "$infile: $!";
open (OUTFILE, ">$outfile") || die "$outfile: $!";
binmode INFILE;
binmode OUTFILE;

my $coun = 0;
my $buff;
my @y; my @u; my @v;
my @r; my @g; my @b;
while (read(INFILE, $buff, 1)) {
my $val = unpack("C1", $buff);

my $i;
if ($coun == 0 || $coun == 1) {
$y[$coun] = $val;

$coun++;
}
elsif ($coun == 2) {
for ($i = 0; $i < 2; $i++) {
$u[$i] = $val - 128;
}

$coun++;
}
elsif ($coun == 3) {
for ($i = 0; $i < 2; $i++) {
$v[$i] = $val - 128;
}

for ($i = 0; $i < 2; $i++) {
$r[$i] = $y[$i] + 1.402*$v[$i];
$g[$i] = $y[$i] - 0.344*$u[$i] - 0.714*$v[$i];
$b[$i] = $y[$i] + 1.772*$u[$i] ;

$r[$i] = &lotate($r[$i], 255);
$g[$i] = &lotate($g[$i], 255);
$b[$i] = &lotate($b[$i], 255);

$val = pack("C1", $r[$i]); print OUTFILE $val;
$val = pack("C1", $g[$i]); print OUTFILE $val;
$val = pack("C1", $b[$i]); print OUTFILE $val;
}

$coun = 0;
}
}

}

sub lotate {
my $val = $_[0];
my $lim = $_[1];

if ($lim < $val) { $val = $lim; }
elsif ($val < 0) { $val = 0; }
else { $val = int $val; }

return $val;
}


テーマ : プログラミング
ジャンル : コンピュータ

2011-04-19 : Work-Linux-Perl : コメント : 0 : トラックバック : 0
Pagetop

cygwinでsystemcを動作させた場合のメモ

まずインストール時にエラーが出たり、大きなプログラムがまともに動作しない場合があるため、以下のページを参考にします。

http://www10.atwiki.jp/bambooflow/pages/77.html

systemc-2.2.0/src/sysc/kernel/sc_constants.hの57行目修正。

const int SC_DEFAULT_STACK_SIZE = 0x50000; // default 0x10000

src/sysc/utils/sc_utils_ids.cpp の61行目あたりに共通ライブラリのインクルードが必要。

#include <cstring>
#include <cstdlib>

後、Makefileの雛形。


CC = g++ -O2

PROGRAM = hoge.exe
ARCH = cygwin
SYSTEMC = /usr/local/systemc-2.2.0

INCDIR = -I. \
-I$(SYSTEMC)/include/
LIBDIR = -L$(SYSTEMC)/lib-$(ARCH)/
LIBS = -lsystemc -lm

SRCS = hoge.cpp \
main.cpp
OBJS = $(SRCS:.cpp=.o)

all:$(PROGRAM)

$(PROGRAM):$(OBJS)
$(CC) -o $@ $^ $(LIBDIR) $(LIBS)

.cpp.o:
$(CC) $(INCDIR) -c $< -o $@

clean:
rm -fr $(PROGRAM) $(OBJS)

テーマ : プログラミング
ジャンル : コンピュータ

2011-04-12 : Work-Linux-C/C++/Java : コメント : 0 : トラックバック : 0
Pagetop
ホーム

プロフィール

zive

Author:zive
大阪在住、男

ブログ検索

月別アーカイブ

FC2カウンター