OpenCV4.1.1の基本
いくつかの基本的な画像処理コード
1.画像の読み取り、表示、ウィンドウの命名、新しいMatオブジェクトを作成するいくつかの方法、およびマスク処理。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main ( )
{
Mat a = imread ( "C:/Users/Lenovo/Desktop/新建文件夹/ConsoleApplication2/智能窗户logo.png" ) ;
namedWindow ( "输出1" , WINDOW_AUTOSIZE) ;
imshow ( "输出1" , a) ;
Mat b;
b. create ( a. size ( ) , a. type ( ) ) ;
b = Scalar ( 0 , 0 , 0 ) ;
namedWindow ( "输出2" , WINDOW_NORMAL) ;
imshow ( "输出2" , b) ;
Mat c ( 300 , 300 , CV_8UC1, Scalar ( 127 ) ) ;
namedWindow ( "输出3" , WINDOW_AUTOSIZE) ;
imshow ( "输出3" , c) ;
Mat qq;
Mat cc = ( Mat_< float > ( 3 , 3 ) << 0 , - 1 , 0 , - 1 , 5 , - 1 , 0 , - 1 , 0 ) ;
filter2D ( a, qq, - 1 , cc) ;
namedWindow ( "output" , WINDOW_AUTOSIZE) ;
imshow ( "output" , qq) ;
Mat d;
d. create ( a. size ( ) , a. type ( ) ) ;
bitwise_not ( a, d) ;
waitKey ( 0 ) ;
return 0 ;
}
画像cの3番目のパラメータCV_8UC1は事前定義された画像であり、事前定義された構造は次のとおりです。
CV_ <bit_depth>(S | U | F)C <number_of_channels>
①--bit_depth-ビット数-は、たとえば、8ビット、16ビット、32ビット、64ビットを表します。
ここで、グレースケール画像を格納するMatオブジェクトを作成すると、この画像のサイズは幅100、高さ100になります。
グレースケール画像には10,000ピクセルがあり、メモリ空間の各ピクセルが占める空間は8ビット、8ビットであるため、CV_8に対応します。
②–S | U | F–S–は—signed int—signedintegerの略です
U-の略-unsignedint-unsigned integer
F--表す--float ---------単精度浮動小数点
③--C<number_of_channels> ----次のように、画像のチャネル数を表します。
1-グレー画像-grayImg-はい-シングルチャネル画像
2–RGBカラー画像---------はい–3チャンネル画像
3 –アルファチャンネル付きRGB画像–はい–4チャンネル画像
2. 2つの画像の比例混合、加算、乗算。
画像ミキシングの原理
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main ( )
{
Mat src1 = imread ( "C:/Users/Lenovo/Desktop/新建文件夹/ConsoleApplication3/智能窗户logo1.png" ) ;
Mat src2 = imread ( "C:/Users/Lenovo/Desktop/新建文件夹/ConsoleApplication3/智能窗户logo2.png" ) ;
if ( ! src1. data)
{
cout << "could not load 智能窗户logo1..." ;
return - 1 ;
}
if ( ! src2. data)
{
cout << "could not load 智能窗户logo2..." ;
return - 1 ;
}
int height = src1. rows;
int width = src1. cols;
cout << height << " " << width << endl;
if ( src1. rows == src2. rows && src1. cols == src2. cols)
{
Mat dst;
double alpha = 0.4 ;
multiply ( src1, src2, dst, 1.0 ) ;
namedWindow ( "智能窗户logo1" , WINDOW_AUTOSIZE) ;
namedWindow ( "智能窗户logo2" , WINDOW_AUTOSIZE) ;
namedWindow ( "混合logo" , WINDOW_AUTOSIZE) ;
imshow ( "智能窗户logo1" , src1) ;
imshow ( "智能窗户logo2" , src2) ;
imshow ( "混合logo" , dst) ;
}
else
{
cout << "could not blend images,the size of images is not same..." ;
return - 1 ;
}
waitKey ( 0 ) ;
return 0 ;
}
第三に、画像の明るさとコントラストを調整します
画像変換は次のように見ることができます:
ピクセル変換ポイント操作
近隣作戦エリア
画像の明るさとコントラストをポイント操作に調整します。原理は次のとおりです。
各ピクセルは255に近くなければならず、明るさが高くなります
saturate_cast(value)値が0〜255の範囲内にあることを確認してください
Mat.at(y、x)(index)= value各ピクセルと各チャネルに値を割り当てます
Mat dst_k = Mat :: zeros(image.size()、image.type());元の画像と同じサイズとタイプの新しい空白の画像を作成し、ピクセル値を0に初期化します。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main ( )
{
Mat src1 = imread ( "C:/Users/Lenovo/Desktop/新建文件夹/ConsoleApplication3/lly.jpg" ) ;
if ( ! src1. data)
{
cout << "image could not load..." << endl;
return - 1 ;
}
string out_put_window = "output" ;
int height = src1. rows;
int width = src1. cols;
float alpha = 1.2 ;
int beta = 30 ;
Mat dst_k = Mat:: zeros ( src1. size ( ) , src1. type ( ) ) ;
for ( int row = 0 ; row < height; row++ )
{
for ( int col = 0 ; col < width; col++ )
{
if ( src1. channels ( ) == 3 )
{
float b = src1. at< Vec3b> ( row, col) ( 0 ) ;
float g = src1. at< Vec3b> ( row, col) ( 1 ) ;
float r = src1. at< Vec3b> ( row, col) ( 2 ) ;
dst_k. at< Vec3b> ( row, col) ( 0 ) = saturate_cast< uchar> ( alpha * b + beta) ;
dst_k. at< Vec3b> ( row, col) ( 1 ) = saturate_cast< uchar> ( alpha * g + beta) ;
dst_k. at< Vec3b> ( row, col) ( 2 ) = saturate_cast< uchar> ( alpha * r + beta) ;
}
else if ( src1. channels ( ) == 1 )
{
float v = src1. at< uchar> ( row, col) ;
dst_k. at< uchar> ( row, col) = saturate_cast< uchar> ( alpha * v + beta) ;
}
}
}
namedWindow ( "before" , WINDOW_AUTOSIZE) ;
imshow ( "before" , src1) ;
namedWindow ( out_put_window, WINDOW_AUTOSIZE) ;
imshow ( out_put_window, dst_k) ;
waitKey ( 0 ) ;
return 0 ;
}
第四に、テキストとグラフィックを描く
グラフィックには、直線、円、楕円、長方形、多角形、ランダムな直線などがあります。
関連API:
正規分布の乱数均一を生成します(int a、int b)
ガウス乱数を生成するgaussian(double sigma)
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
Mat src;
void myline ( ) ;
void myRectangle ( ) ;
void myEllipse ( ) ;
void mycircle ( ) ;
void myPolygon ( ) ;
void Randomlinedemo ( ) ;
int main ( )
{
src = imread ( "C:/Users/Lenovo/Desktop/新建文件夹/ConsoleApplication3/lly.jpg" ) ;
if ( ! src. data)
{
cout << "image could not load..." << endl;
return - 1 ;
}
string out_put_window = "output" ;
myline ( ) ;
myRectangle ( ) ;
myEllipse ( ) ;
mycircle ( ) ;
myPolygon ( ) ;
putText ( src, "HELLO WORLD!" , Point ( 200 , 100 ) , FONT_HERSHEY_COMPLEX, 1.0 , Scalar ( 12 , 23 , 255 ) , 2 , 8 ) ;
Randomlinedemo ( ) ;
namedWindow ( out_put_window, WINDOW_AUTOSIZE) ;
imshow ( out_put_window, src) ;
waitKey ( 0 ) ;
return 0 ;
}
void myline ( )
{
Point p1 = Point ( 20 , 30 ) ;
Point p2;
p2. x = 400 ;
p2. y = 300 ;
Scalar color = Scalar ( 0 , 0 , 225 ) ;
line ( src, p1, p2, color, 1 , LINE_8) ;
}
void myRectangle ( )
{
Rect rect_a = Rect ( 200 , 100 , 300 , 300 ) ;
Scalar color = Scalar ( 255 , 0 , 0 ) ;
rectangle ( src, rect_a, color, 1 , LINE_8) ;
}
void myEllipse ( )
{
Scalar color = Scalar ( 0 , 255 , 0 ) ;
ellipse ( src, Point ( src. rows / 2 , src. cols / 2 ) , Size ( src. rows / 4 , src. cols / 8 ) , 90 , 0 , 360 , color, 2 , LINE_8) ;
}
void mycircle ( )
{
Scalar color = Scalar ( 0 , 255 , 255 ) ;
circle ( src, Point ( 500 , 500 ) , 200 , color, 3 , LINE_8) ;
}
void myPolygon ( )
{
Point pts[ 1 ] [ 5 ] ;
pts[ 0 ] [ 0 ] = Point ( 100 , 100 ) ;
pts[ 0 ] [ 1 ] = Point ( 100 , 200 ) ;
pts[ 0 ] [ 2 ] = Point ( 200 , 200 ) ;
pts[ 0 ] [ 3 ] = Point ( 200 , 100 ) ;
pts[ 0 ] [ 4 ] = Point ( 100 , 100 ) ;
const Point* ppts[ ] = {
pts[ 0 ] } ;
int npt[ ] = {
5 } ;
Scalar color = Scalar ( 255 , 255 , 0 ) ;
fillPoly ( src, ppts, npt, 1 , color, 8 ) ;
}
void Randomlinedemo ( )
{
RNG rng ( 12345 ) ;
Point p1;
Point p2;
Mat py = Mat:: zeros ( src. size ( ) , src. type ( ) ) ;
namedWindow ( "py" , WINDOW_AUTOSIZE) ;
for ( int i = 0 ; i < 100 ; i++ )
{
p1. x = rng. uniform ( 0 , src. rows) ;
p2. x = rng. uniform ( 0 , src. rows) ;
p1. y = rng. uniform ( 0 , src. cols) ;
p2. y = rng. uniform ( 0 , src. cols) ;
Scalar color = Scalar ( rng. uniform ( 0 , 255 ) , rng. uniform ( 0 , 255 ) , rng. uniform ( 0 , 255 ) ) ;
line ( py, p1, p2, color, 1 , 8 ) ;
if ( waitKey ( 50 ) > 0 )
{
break ;
}
imshow ( "py" , py) ;
}
}