OpenCV 学習:cvCopy で 型変換

2017-08-26 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
“OpenCV”の C 関数:
CvMat* cvCloneMat( const CvMat* mat ); は、

  Creates a full matrix copy.

と云うことですね。

なので、
  img2 = cv2.cvCloneMat( img )
とすれば、
既存のimg から、そっくりなimg2ができる。

一方で、今回学習した、C 関数:
void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask ); は、

  Copies one array to another.

と云うことですね。

これでは、
既存のimg から、適切に領域を用意したimg2にコピーできる。

これだと、データ型の変換
 ・CvMat 型 → IplImage 型
 ・IplImage 型 → CvMat 型
に使える?

それで、1本コーディングしてみた:
----- conv_mat-Ipl.gsl -----
require'cv2_a'

fnam = 'test.tif' ----- テスト画像:2行5列

Timg = cv2.cvCreateMat( 2, 5, CV_8UC1 )
T = { 10, 30, 50, 70, 90, 110, 130, 150, 170, 190 }
for n=0,9 do Timg.Byte[n]=T[n+1] end
cv2.cvSaveImage( fnam, Timg, 0 )

--============================================
---------- IplImage 型 → CvMat 型

----- (1) IplImage 型で読込:
Iimg = cv2.cvLoadImage( fnam, 0 )
p = ffi.cast( 'uint8_t*', Iimg.data )
print( p[1*5+4], p[1*8+4] ) -- 2行目の5列目:正しくは 4 バイト境界

----- (2) CvMat 型領域確保 & コピー(変換):
Mimg = cv2.cvCreateMat( Iimg.yy, Iimg.xx, CV_8UC1 )
cv2.cvCopy( Iimg, Mimg, NULL )
print( Mimg.Byte[1*5+4] ) -- 2行目の5列目

--============================================
---------- CvMat 型 → IplImage 型

----- (1) CvMat 型で読込:
Nimg = cv2.cvLoadImageM( fnam, 0 )
print( Nimg.Byte[1*5+4] ) -- 2行目の5列目

----- (2) IplImage 型領域確保 & コピー(変換):
SZ = ffi.new( 'CvSize', Nimg.xx, Nimg.yy )
Oimg = cv2.cvCreateImage( SZ, 8, 1 )
-- int depth, int channels
cv2.cvCopy( Nimg, Oimg, NULL )
q = ffi.cast( 'uint8_t*', Oimg.data )
print( q[1*5+4], q[1*8+4] ) -- 2行目の5列目:正しくは 4 バイト境界
と云うことで???

出来ました。


IplImage 型が好きになれないのは、
行毎に、4バイト境界にアラインされるから。


因みに、
'cv2_a.lua' 内で2つのデータ型の定義は以下:
--  構造体の定義:
ffi.cdef[[
typedef struct CvMat{
int type; int step; int* refcount; int hdr_refcount;
union{ unsigned char* Byte; char* Char;
unsigned short* Word; int* Int; double* Dbl; };
union{ int rows; int height; int yy; };
union{ int cols; int width; int xx; };
} CvMat;

typedef struct _IplImage{
int nSize; int ID; int nChannels;
int alphaChannel; int depth;
char colorModel[4]; char channelSeq[4];
int dataOrder; int origin; int align;
union{ int cols; int width; int xx; };
union{ int rows; int height; int yy; };
struct _IplROI *roi; struct _IplImage* maskROI;
void* imageId; struct _IplTileInfo *tileInfo;
int imageSize; union{ void* data; char* imageData; };
int widthStep;
int BorderMode[4]; int BorderConst[4];
char* imageDataOrigin;
} IplImage;
]]
と云った感じ。


本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170723
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク