OpenCV学習(一)
55890 ワード
OpenCV学習
シンボル規則:
g_nはグローバルな整数変数を表し、g_dはグローバルな32ビット変数、srcはソースオブジェクト、g_bはブール値を表す.
画像の読み込み:imread()関数
関数のプロトタイプ:
階調図,原図,深さ8/16/32ビットの図の意味を理解する必要がある.
使用方法:
画像の表示:imshow()関数
関数のプロトタイプ:
imshow()は、指定したウィンドウに画像を表示するために使用されます.既定値はCV_WINDOW_AUTOSIZEは、オリジナル画像サイズを表示します.
画像の深さに応じて、imshow()で画像をスケールします. 8ビット符号なし、原図 16ビット符号なし/32ビット整数、画素値/256 を表示する. 32ビット浮動小数点、ピクセル値*255 使用方法:
作成ウィンドウさくせいうぃんどう:namedWindow()関数namedWindow()かんすう
関数のプロトタイプ: const string&型のnameは、ウィンドウの識別子として使用されるウィンドウ名を記入します. intタイプのflags、ウィンドウの識別は、以下のいくつかの値を記入することができます.
WINDOW_NORMAL、この値を設定すると、ユーザーはウィンドウのサイズを変更できます(制限はありません).OpenCV 2ではCV_と書くこともできますWINDOW_NORMAL.
WINDOW_AUTOSIZEは、この値を設定すると、表示される画像に合わせて自動的にウィンドウサイズが調整され、ユーザーが手動でウィンドウサイズを変更することはできません.OpenCV 2ではCV_と書くこともできますWINDOW_AUTOSIZE.
WINDOW_OPENGL、この値を設定し、ウィンドウ作成時にOpenGLをサポートします.OpenCV 2ではCV_と書くこともできますWINDOW_OPENGL.
namedWindow関数の役割は、指定した名前で画像とプログレスバーとして使用できるコンテナウィンドウを作成することです. は、
画像をファイルに出力:imwrite()関数
関数の意味:
画像フォーマットはファイル拡張子に基づいており、保存可能な拡張子は
関数宣言: JPEG形式のピクチャで、パラメータ(3番目)は0から100までのピクチャ品質( PNG形式のピクチャは、圧縮レベル( PPM、PGM、またはPBMは、0または1の値をとり、デフォルト値は1であるバイナリフォーマットフラグ(
サンプルプログラム
総合例1:
プログラムインタフェースにスライドバーを追加する:createTrackbar()関数createTrackbar()関数
関数の意味:
関数のプロトタイプ:
パラメータの意味:
例:
Visual Studioでアイテムを閉じる警告(VS実行中にエラーが発生した解決方法)
Visual Studio IDEでプロジェクト全体の警告を閉じるには、次の手順に従います.
プロジェクトの[プロパティページ](Properties Page)ダイアログボックスを開きます.「プロパティ・ページ」ダイアログ・ボックスの使用方法については、「プロパティ・ページ」を参照してください.「プロパティの構成」>「c/c++」>「詳細」プロパティ・ページを選択します.特定の警告の無効化(Disable Specific Warning)アトリビュートを編集して、
Alphaブレンド:作用:半透明効果を実現する. 詳述:ある不透明なものの色がAであり、もう一つの透明なものの色がBであると仮定すると、Bを通してAを見ると、見える色CはBとAの混合色であり、この式で近似することができる.B物体の透明度をalpha(0−1,0は完全透明,1は完全不透明)R(C)=a l p h a∗R(B)+(1−a l p h a)∗R(A)R(C)=alpha*R(B)+(1−alpha)*R(A)R(C)=alpha∗R(B)+(A)=alpha∗R(B)+(1−alpha)+(1−alpha)∗R(A)G(C)=a l p h a∗G(B)+(1−−−−−−−−−−−a(B)+(1−−−−−−−−−−−−−−−−−−−a a l p h a)∗G(A)G(C)=alpha*G(B)+(1-alpha)*G(A)G(C)=alpha∗G(B)+(1−alpha)∗G(A)B(C)=a l p h a∗B(B)+(1−a l p h a)∗B(A)B(C)=alpha*B(B)+(1−alpha)*B(C)=alpha∗B(B)+(1−alpha)∗B(A)R(x)、G(x)、B(x)はそれぞれ色xのRGB成分を指す.Alphaハイブリッドテクノロジーを適用すると、最もまぶしい火、煙、シャドウ、ダイナミック光源などのすべての半透明効果を実現できます.参照リンク:RGBA alpha透明度ハイブリッドアルゴリズム実装とテスト 現在のトラックバーの場所の取得:getTrackbarPos()関数getTrackbarPos()関数
関数のプロトタイプ:
マウス操作:SetMouseCallback()関数
関数の意味:
関数のプロトタイプ: void*タイプの
例:
シンボル規則:
g_nはグローバルな整数変数を表し、g_dはグローバルな32ビット変数、srcはソースオブジェクト、g_bはブール値を表す.
画像の読み込み:imread()関数
関数のプロトタイプ:
Mat imread(const string& filename,intflags=1)
const string&
タイプのfilename
は、画像をロードするパス名である.int
タイプのflags
は、ロードIDであり、ロード画像の色タイプを指定する.階調図,原図,深さ8/16/32ビットの図の意味を理解する必要がある.
使用方法:
Mat image0 = imread("1.jpg",2|4); //
Mat image1 = imread("1.jpg",0); //
Mat image2 = imread("1.jpg",199); //
画像の表示:imshow()関数
関数のプロトタイプ:
void imshow(const strings& winname, InputArray mat);
const string&
タイプのwinname
で、表示するウィンドウ識別名を記入します.InputArray
タイプのmat
で、表示する画像を記入します.imshow()は、指定したウィンドウに画像を表示するために使用されます.既定値はCV_WINDOW_AUTOSIZEは、オリジナル画像サイズを表示します.
画像の深さに応じて、imshow()で画像をスケールします.
Mat srcImage=imread("1.jpg");//
mshow("【 】",srcImage);//
作成ウィンドウさくせいうぃんどう:namedWindow()関数namedWindow()かんすう
関数のプロトタイプ:
void namedWindow(const string& winname,int flags=WINDOW_AUTOSIZE);
WINDOW_NORMAL、この値を設定すると、ユーザーはウィンドウのサイズを変更できます(制限はありません).OpenCV 2ではCV_と書くこともできますWINDOW_NORMAL.
WINDOW_AUTOSIZEは、この値を設定すると、表示される画像に合わせて自動的にウィンドウサイズが調整され、ユーザーが手動でウィンドウサイズを変更することはできません.OpenCV 2ではCV_と書くこともできますWINDOW_AUTOSIZE.
WINDOW_OPENGL、この値を設定し、ウィンドウ作成時にOpenGLをサポートします.OpenCV 2ではCV_と書くこともできますWINDOW_OPENGL.
destroyWindow
()またはdestroyAllWindows
()関数を呼び出してウィンドウを閉じ、以前に割り当てられたウィンドウに関連するすべてのメモリ領域をキャンセルすることができる.画像をファイルに出力:imwrite()関数
関数の意味:
imwrite
関数は、指定されたファイルに画像を保存するために使用されます.画像フォーマットはファイル拡張子に基づいており、保存可能な拡張子は
imread
で読み取れる画像拡張子と一致している.関数宣言:
bool imwrite(const string& filename,InputArray img,const vector<int>& params=vector<int>();
const string&
タイプのfilename
で、書き込むファイル名を記入します.「123.jpg」などの接尾辞を付けることに注意してください.InputArray
タイプのimg
で、一般的にMatタイプの画像データを記入します.const vector&
タイプのparams
は、特定のフォーマットで保存されたパラメータ符号化として表される.デフォルト値vector0
があるので、一般的には記入する必要はありません.CV_IMWRITE_JPEG_QUALITY
)を表し、デフォルト値は95です.CV_IMWRITE_PNG_COMPRESSION
)が0から9であることを示す.より高い値は、より小さいサイズとより長い圧縮時間を意味し、デフォルトは3です.CV_IMWRITE_PXM_BINARY
)を表す.サンプルプログラム
// OpenCV png , 。
#include
#include
using namespace cv;
using namespace std;
void createAlphaMat(Mat &mat)
{
for(inti=0;i<mat.rows;++i){
for(intj=0;j<mat.cols;++j){
Vec4b&rgba=mat.at<Vec4b>(i,j);
rgba[0]=UCHAR_MAX;
rgba[1]=saturate_cast<uchar>((float(mat.cols-j))/((float)mat.cols)*UCHAR_MAX);
rgba[2]=saturate_cast<uchar>((float (mat.rows-i))/((float)mat.rows)*UCHAR_MAX);
rgba[3]=saturate_cast<uchar>(0.5*(rgba[1]+rgba[2]));
}
}
}
int main()
{
// Alpha Mat
Mat mat (480, 640, CV_8UC4);
createAlphaMat(mat);
vector<int>compression_params;
// OpenCV2 :
//compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
// OpenCV3 :
compression_params,push_back(IMWRITE_PNG_COMPRESSION);
compression_params.push_back(9);
try{
imwrite(" Alpha .png",mat,compression_params);
imshow(" PNG ",mat);
fprintf(stdout,"PNG alpha ~
imwrite
");
waitKey(0);
}
catch(runtime_error&ex){
fprintf(stderr," PNG :%s
",ex.what());
return 1;
}
return 0;
}
総合例1:
// , , , jpg 。
#include
#include
using namespace cv;
int main( )
{
//----------------【 、 】-------------
// :
//------------------------------------------------
Mat girl=imread("girl.jpg"); // Mat
namedWindow("【1】 "); // "【1】 "
imshow("【1】 ",girl);// "【1】 "
//--------------------【 、 】-------------------
// : 、
//-----------------------------------------------------
//
Mat image= imread("dota.jpg",199);
Mat logo= imread("dota_logo.jpg");
//
namedWindow("【2】 ");
imshow("【2】 ",image);
namedWindow("【3】logo ");
imshow("【3】logo ",logo);
// Mat , , ROI
Mat imageROI;
//
imageROI= image(Rect(800,350,logo.cols,logo.rows));
//
//imageROI= image(Range(350,350+logo.rows),Range(800,800+logo.cols));
// logo
addWeighted(imageROI,0.5,logo,0.3,0.,imageROI);
//
namedWindow("【4】 +logo ");
imshow("【4】 +logo ",image);
//-------------------------【 、 】---------------------
// : Mat
//------------------------------------------------------------
// jpg
imwrite(" imwrite .jpg",image);
waitKey();
return 0;
}
プログラムインタフェースにスライドバーを追加する:createTrackbar()関数createTrackbar()関数
関数の意味:
createTrackbar
関数は、数値を調整できるスライドバー(トラックバーとも呼ばれることが多い)を作成し、指定したウィンドウにスライドバーをアタッチするのに便利です.コールバック関数と組み合わせて使用されることが多い.関数のプロトタイプ:
int createTrackbar(conststring& trackbarname,conststring& winname,int* value, int count, TrackbarCallback onChange=0, void* userdata=0);
パラメータの意味:
const string&
タイプのtrackbarname
は、作成したトラックを表すトラックバーの名前です.const string&
タイプのwinname
、ウィンドウの名前、namedWindow()
がウィンドウを作成するときに記入するウィンドウ名に対応します.int*
タイプのvalue
は、スライダ位置を示す整数のポインタを指します.作成時にスライダの初期位置が変数の現在の値になります.int
タイプのcount
は、スライダが達成できる最大位置の値を示しています.スライダの最小位置の値は、常に0
です.TrackbarCallback
タイプのonChange
で、デフォルト値0があります.これは、スライダの位置が変わるたびにコールバックされるコールバック関数を指すポインタです.この関数のプロトタイプはvoidXXXX(int,void*)
でなければならない.1番目のパラメータはトラックバーの位置で、2番目のパラメータはユーザーデータです.コールバックがNULL
ポインタである場合、コールバック関数の呼び出しがないことを示し、3番目のパラメータvalue
のみが変化する.void*
タイプのuserdata
で、デフォルト値0
もあります.このパラメータは、トラックバーイベントを処理するためにユーザがコールバック関数に渡すデータです.使用する3番目のパラメータvalue実パラメータがグローバル変数であれば、このuserdata
パラメータをまったく管理しなくてもよい.例:
#include
#include
using namespace cv;
//-----------------------------------【 】-----------------------------------------
// :
//---------------------------------------------------------------------------------------
#define WINDOW_NAME "【 & 】" //
//-----------------------------------【 】------------------------------------
// :
//---------------------------------------------------------------------------------------
const int g_nMaxAlphaValue = 100;//Alpha
int g_nAlphaValueSlider;//
double g_dAlphaValue; /*g_n ,g_d 32 */
double g_dBetaValue;
//
Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;
//-----------------------------------【on_Trackbar( ) 】--------------------------------
// :
//---------------------------------------------------------------------------------------
void on_Trackbar( int, void* ) //
{
// alpha
g_dAlphaValue = (double) g_nAlphaValueSlider/g_nMaxAlphaValue ;
// beta 1 alpha
g_dBetaValue = ( 1.0 - g_dAlphaValue );
// alpha beta
addWeighted( g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
//
imshow( WINDOW_NAME, g_dstImage );
}
//--------------------------【ShowHelpText( ) 】----------------
// :
//----------------------------------------------------------------
void ShowHelpText()
{
// OpenCV
printf("
\t\t\t !
");
printf("
\t\t\t , 《OpenCV3 》
");
printf("
\t\t\t OpenCV :" CV_VERSION );
printf("
------------------------------------------------------------------
");
}
//-------------------------【main( ) 】---------------------------
// : ,
//-----------------------------------------------------------------
int main( int argc, char** argv )
{
//
ShowHelpText();
// ( )
g_srcImage1 = imread("1.jpg");
g_srcImage2 = imread("2.jpg");
if( !g_srcImage1.data ) {
printf(" , imread ~!
"); return -1; }
if( !g_srcImage2.data ) {
printf(" , imread ~!
"); return -1; }
// 70
g_nAlphaValueSlider = 70;
//
namedWindow(WINDOW_NAME, 1);
//
char TrackbarName[50];
sprintf( TrackbarName, " %d", g_nMaxAlphaValue );
createTrackbar( TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar );
//
on_Trackbar( g_nAlphaValueSlider, 0 );
//
waitKey(0);
return 0;
}
Visual Studioでアイテムを閉じる警告(VS実行中にエラーが発生した解決方法)
Visual Studio IDEでプロジェクト全体の警告を閉じるには、次の手順に従います.
プロジェクトの[プロパティページ](Properties Page)ダイアログボックスを開きます.「プロパティ・ページ」ダイアログ・ボックスの使用方法については、「プロパティ・ページ」を参照してください.「プロパティの構成」>「c/c++」>「詳細」プロパティ・ページを選択します.特定の警告の無効化(Disable Specific Warning)アトリビュートを編集して、
4996
を追加します.変更を適用するには、「OK」を選択します.Alphaブレンド:
関数のプロトタイプ:
int getTrackbarPos(conststring& trackbarname,conststring& winname);
const string&
タイプのtrackbamame
は、トラックバーの名前を表す.const string&
タイプのwinname
は、トラックバーの親ウィンドウの名前を表します.マウス操作:SetMouseCallback()関数
関数の意味:
SetMouseCallback
関数の役割は、指定されたウィンドウにマウスコールバック関数を設定することです.関数のプロトタイプ:
void setMouseCallback(conststring& winname,MouseCallback onMouse,void* userdata=0)
const string&
タイプのwinname
、ウィンドウの名前.MouseCallback
タイプのonMouse
は、ウィンドウ内でマウス時間が発生するたびに呼び出される関数ポインタを指定します.この関数のプロトタイプの概略形式はvoid Foo(intevent,int x,int y,int flags,void* param)
である.ここで、event
はEVENT_+
x
およびy
は、画像座標系(ウィンドウ座標系ではないことに留意されたい)におけるマウスポインタの座標値であり、flags
はEVENT_FLAG
の組合せであり、param
は、ユーザ定義のSetMouseCallback
関数呼び出しに伝達されるパラメータである.EVENT_MOUSEMOVE
がマウス移動メッセージ、EVENT_LBUTTONDOWN
がマウス左ボタン押下メッセージなどである.Note:OpenCV 2では、上記「EVENT_」前に「CV_」を付けることができます接頭辞.userdata
で、ユーザー定義のコールバック関数に渡されるパラメータには、デフォルト値0があります.例:
/*************【 】 **********/
#include
using namespace cv;
//-----------------------------------【 】-----------------------
// :
//---------------------------------------------------------------------
#define WINDOW_NAME "【 】" //
//-----------------------------------【 】-------------------
// :
//-----------------------------------------------------------------------
void on_MouseHandle(int event, int x, int y, int flags, void* param);
void DrawRectangle( cv::Mat& img, cv::Rect box );
void ShowHelpText( );//
//-----------------------------------【 】--------------------
// :
//-----------------------------------------------------------------------
Rect g_rectangle;
bool g_bDrawingBox = false;//
RNG g_rng(12345);
//-----------------------------------【main( ) 】------------------------
// : ,
//------------------------------------------------------------------------
int main( int argc, char** argv )
{
//【0】 console
system("color 9F");
//【0】 ( )
ShowHelpText();
//【1】
g_rectangle = Rect(-1,-1,0,0);
Mat srcImage(600, 800,CV_8UC3), tempImage;
srcImage.copyTo(tempImage);
g_rectangle = Rect(-1,-1,0,0);
srcImage = Scalar::all(0);
//【2】
namedWindow( WINDOW_NAME );
setMouseCallback(WINDOW_NAME,on_MouseHandle,(void*)&srcImage);
//【3】 , ,
while(1)
{
srcImage.copyTo(tempImage);//
if( g_bDrawingBox ) DrawRectangle( tempImage, g_rectangle );// ,
imshow( WINDOW_NAME, tempImage );
if( waitKey( 10 ) == 27 ) break;// ESC ,
}
return 0;
}
//--------------------------------【on_MouseHandle( ) 】-------------
// : ,
//---------------------------------------------------------------------
void on_MouseHandle(int event, int x, int y, int flags, void* param)
{
Mat& image = *(cv::Mat*) param;
switch( event)
{
//
case EVENT_MOUSEMOVE:
{
if( g_bDrawingBox )// , RECT
{
g_rectangle.width = x-g_rectangle.x;
g_rectangle.height = y-g_rectangle.y;
}
}
break;
//
case EVENT_LBUTTONDOWN:
{
g_bDrawingBox = true;
g_rectangle =Rect( x, y, 0, 0 );//
}
break;
//
case EVENT_LBUTTONUP:
{
g_bDrawingBox = false;// false
// 0
if( g_rectangle.width < 0 )
{
g_rectangle.x += g_rectangle.width;
g_rectangle.width *= -1;
}
if( g_rectangle.height < 0 )
{
g_rectangle.y += g_rectangle.height;
g_rectangle.height *= -1;
}
//
DrawRectangle( image, g_rectangle );
}
break;
}
}
//-----------------------------------【DrawRectangle( ) 】------------------------------
// :
//---------------------------------------------------------------------------------------
void DrawRectangle( cv::Mat& img, cv::Rect box )
{
cv::rectangle(img,box.tl(),box.br(),cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0,255), g_rng.uniform(0,255)));//
}