Opencvにおけるcバージョンとc++バージョンの区別体験

2153 ワード

1. 表示ウィンドウサイズの変更方法が異なります.
cバージョンでは、ウィンドウを定義するときにcvNamedWindowを使用します.
例えばcvNamedWindow(「src」,0);後のパラメータが0の場合、ウィンドウのサイズは手動で変更できます.そうしないと、ウィンドウのサイズは適応ピクチャサイズになります.
一方、c++バージョンで定義ウィンドウはnamedWindowである.
例えばnamedWindow(「src」,1);後の2番目のパラメータがいくらであっても、画像サイズに基づいて自動的に生成されるため、ウィンドウのサイズを手動で変更することはできません.
また、ウィンドウのサイズを手動で調整する効果を見るには、cvShowImage(「src」、img)を合わせる必要があります.
すなわち、後にc++バージョンのimshow(「src」,img)が表示される場合.画像のサイズを手動で調整する効果も見られません.
 
  2. 画像を表示する関数が異なります.
Opencvのcバージョンでは、画像用cvShowImageが表示されます.
例えば、cvShowImage(「src」,img);
また、ここでのimgはIplImage*タイプなので、定義したimgがMatタイプであれば使えません.プログラムは自動的にMatタイプをIplImage*タイプに変換できないからです.
Opencvのc++バージョンでは、画像を表示するのにimshowが使われています.
例えば、imshow(「src」,img);
もちろんここのimgはMatタイプです.つまり,ここのimgがIplImage*ではだめであり,プログラムが自動的にIplImage*をMatタイプに変換することはできない.
上の2点から、画像のサイズを手動で変更するには、cvNamedWidow(「src」、0)が必要であることに注意してください.
cvShowImage(「src」,img)を併用します.ここでimgはIplImage*タイプです.
もちろんcvNamedWindow(「src」,0)はimshow(「src」,img)と併用することもでき、imgはMatタイプであるが、ウィンドウサイズを自動的に変更する目的には至らない.
一般的にはnamedWindow(「src」,1)とimshow(「src」,img)が一緒に使われるからです.
 
      IplImage     :

int nSize

int ID

int nChannels

int alphaChannel

int depth

char colorModel [4]

char channelSeq [4]

int dataOrder

int origin

int align

int width

int height

struct _IplROI * roi

struct _IplImage * maskROI

void * imageId

struct _IplTileInfo * tileInfo

int imageSize

char * imageData

int widthStep

int BorderMode [4]

int BorderConst [4]

char * imageDataOrigin

一方、Mat構造体は、Matヘッダ(ヘッダに記録されているのはマトリクスの大きさ、記憶方式など)とマトリクスを指すポインタを含む.だから2つには大きな違いがあるので、プログラムが自動的に変換できないのはMat構造がもっと複雑だからです.
  3. 画像の読み方が違います.
cバージョンで画像を読み取るのはcvLoadImageです.
例えばcvLoadImage(「lena.jpg」);
c++バージョンでは、画像の読み取りにimreadが使用されます.
例えばimread(「lena.jpg」);
もちろんこの2種類のlena画像は工事カタログの下に入っています.
しかし、ここで非常に異なるのは、cvLoadImage()のパラメータがconst char*タイプであり、imread()のパラメータがconst&string型であることです.この2つは全く異なり、opencvでも自動的に変換することはできません.cとc++関数を混ぜてopencvコードを書くときは注意してください.
 
  4.パスの表示方法が違います.
cバージョンでは、パス間に2つの右斜線、すなわち「\」を使用します.斜線を1つ使用すると、エラーが表示されます.
c++バージョンでは、パス間で1つまたは2つ以上の斜線を使用することができます.