Ubuntu18.04 は opencv ライブラリを使用してカメラを書き込み、開き、ビデオを圧縮します

1.opencvをインストール

1. 設置環境

VMware 仮想マシンにインストールされているUbuntu 18.04 システム
OpenCV バージョン: 3.4.12

2.OpenCV3.4.11をダウンロード

国内の高速ダウンロード Web サイト:クリックしてジャンプします。
仮想マシンでブラウザを直接使用できます (ダウンロード、外国の公式 Web サイトのダウンロード アドレス:クリックしてジャンプします。外国の Web サイトでダウンロードすることはお勧めしません。非常に遅いです。
ここに画像の説明を挿入
ダウンロード後、メインディレクトリに直接展開します。
ここに画像の説明を挿入

3. cmake を使用して opencv をインストールします。

最初に解凍したフォルダーに入ります: opencv-3.4.12
ここに画像の説明を挿入
root ユーザーを入力し、更新します:
ここに画像の説明を挿入
次に、cmake をインストールします:
ここに画像の説明を挿入
キーポイント: 依存ライブラリをインストールします:
コマンド:
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat- dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev
ただし、最後のライブラリは libjasper-dev を個別にインストールする必要があります。
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
最初にこのライブラリをインストールしてから、上記のコマンドを入力して他のライブラリを一律にインストールします。

ビルド フォルダーを再度作成し、作成したフォルダーを入力します。ビルドは
ここに画像の説明を挿入
cmake コンパイル パラメーターを使用します:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local …
ここに画像の説明を挿入

4. make を使用して作成およびコンパイルする

build フォルダーの下で実行されます:
sudo make
このステップには時間がかかります。辛抱強く待ってください。
ここに画像の説明を挿入

5. インストール

sudo make install
ここに画像の説明を挿入

6. 環境を構成する

コマンド sudo gedit /etc/ld.so.conf.d/opencv.conf を使用して opencv.conf ファイルを変更します。開いているファイルは空です。opencv ライブラリのインストール パスを追加します: /usr/local/lib
ここに画像の説明を挿入

保存すると、警告メッセージが表示されますが、心配する必要はありません。これは正常です。
ここに画像の説明を挿入
システム共有リンクライブラリを更新: sudo ldconfig
configure bash、bash.bashrc ファイルを変更: sudo gedit /etc/bash.bashrc
ここに画像の説明を挿入
ファイルの最後に追加:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH
ここに画像の説明を挿入
保存してsource /etc/bash.bashrc
Update: sudo updatedb
次にopencvのバージョン情報を確認: pkg-config --modversion opencv
ここに画像の説明を挿入

2.例:写真

コード ファイルを保存するフォルダーを作成します。
mkdir code
cd code
ここに画像の説明を挿入
test1.cpp ファイルを作成します。
nano test1.cpp
を開き、次のコードを入力します。

#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
    
    
	CvPoint center;
    double scale = -3; 

	IplImage* image = cvLoadImage("lena.jpg");
	argc == 2? cvLoadImage(argv[1]) : 0;
	
	cvShowImage("Image", image);
	
	
	if (!image) return -1; 	center = cvPoint(image->width / 2, image->height / 2);
	for (int i = 0;i<image->height;i++)
		for (int j = 0;j<image->width;j++) {
    
    
			double dx = (double)(j - center.x) / center.x;
			double dy = (double)(i - center.y) / center.y;
			double weight = exp((dx*dx + dy*dy)*scale);
			uchar* ptr = &CV_IMAGE_ELEM(image, uchar, i, j * 3);
			ptr[0] = cvRound(ptr[0] * weight);
			ptr[1] = cvRound(ptr[1] * weight);
			ptr[2] = cvRound(ptr[2] * weight);
		}

	Mat src;Mat dst;
	src = cvarrToMat(image);
	cv::imwrite("test.png", src);

    cvNamedWindow("test",1);  	imshow("test", src);
	 cvWaitKey();
	 return 0;
}

コンパイル ファイル:
c++ ファイル コンパイル命令: g++ test1.cpp -o test1pkg-config --cflags --libs opencv
ビルドされた .c ファイルの場合: gcc test1.cpp -o test1pkg-config --cflags --libs opencv

上記のコンパイルコマンドでは、主に次の機能を持つツール「pkg-config」を実際に使用しました。
1. ライブラリのバージョン番号を確認します。必要なライブラリのバージョンが要件を満たしていない場合、間違ったバージョンのライブラリ ファイルをリンクしないようにエラー メッセージが出力されます。
2. マクロ定義やヘッダー ファイルの場所など、コンパイル前処理パラメーターを取得します。
3. ライブラリやその他の依存ライブラリの場所、ファイル名、その他の接続パラメータなどのリンク パラメータを取得します。
4. 依存する他のライブラリの設定を自動的に追加する.
このツールを使用すると、コンパイルが非常に便利になります (ただし、その前に、OpenCV インストール リンク ライブラリ ファイルのディレクトリに pkgconfig フォルダがあることを確認する必要があります)。このフォルダーには opencv.pc ファイルがあり、実際には、これは pkg-config の下の OpenCV 構成ファイルです)。
pkg-config を使用する場合、オプション –cflags は、プログラムが必要とするヘッダー ファイルがコンパイルされるディレクトリを指定するために使用され、オプション –libs は、リンク時にプログラムが必要とするダイナミック リンク ライブラリのディレクトリを指定するために使用されます。
ここに画像の説明を挿入
ここに画像の説明を挿入
出力結果: ./test1 は
ここに画像の説明を挿入
lena.jpg から test.png を生成し、レンダリング効果が異なります。

3. 例: ビデオ

1. 仮想マシンがカメラの許可を取得します

Windows では、win+R を使用してコマンド ウィンドウを開き、services.msc と入力します。
ここに画像の説明を挿入
ここに画像の説明を挿入
vmware usb アービトレーションを見つけて、正常に開いていることを確認します。
VMware で [仮想マシン] をクリックし、[設定(S)...] をクリックします。「USB コントローラ」を選択し、「USB 互換性」を「USB 3.0」に設定して、「OK」をクリックします。
「仮想マシン」を選択し、「リムーバブル デバイス」を選択し、「IMC Networks USB2.0 VGA UVC WebCam」を選択し、最後に「接続」をクリックし、ポップアップ ウィンドウで「OK」をクリックします。
仮想マシンの右下隅にあるカメラ アイコンに小さな緑色の点がある場合、接続は成功しています。
接続に失敗したと彼が言った場合は、まずホスト コンピューターのカメラの電源を入れてから、カメラを使用して電源を入れると、接続が成功します。

2. 動画を再生する

test2.cpp ファイルを作成します:
nano test2.cpp

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
    
    
	//读取视频
	VideoCapture capture("MH.mp4");
	//循环显示每一帧
	while(1){
    
    
		Mat frame;//定义一个Mat变量,用于存储每一帧的图像
		capture >> frame;//读取当前帧
		if(frame.empty())//播放完毕,退出
			break;
		imshow("读取视频帧",frame);//显示当前帧
		waitKey(30);//掩饰30ms
	}
	system("pause");
	return 0;
}


1. ステートメント: VideoCapture capture(0) の場合、次のパラメーターが 0 に設定され、カメラからビデオを読み取り、各フレームをループで表示します; MH などのビデオ ファイル名に設定されている場合。 mp4、ビデオがキャプチャされ、各フレームを読み取ってループします。
2. while ループ本体の Mat データ構造は、実際には画像上の各ポイントに対応するドット マトリックスです. ポイントのコレクションは、画像のフレームを形成します. Mat の詳細については、次を参照してください: OpenCV 3 の Mat データ構造ステートメント: waitKey
( 30) 、パラメーターの単位は ms ミリ秒、つまり、各フレーム間の間隔は 30 ミリ秒です。このステートメントは削除できません。そうしないと、エラーが発生し、ビデオを再生または記録できません。
このコードは while ループの中で実行され続けるため、画像表示ウィンドウをマウスで閉じようとすると、閉じることができません。プログラムを強制的に中断するには、キーボードの Ctrl+C を使用する必要があり、これは非常に不親切です。

test2.cpp ファイルをコンパイルします: g++ test2.cpp -o test2pkg-config --cflags --libs opencv
ここに画像の説明を挿入
出力:
./test2
ここに画像の説明を挿入

3.カメラの電源を入れてビデオを録画します

test3.cpp ファイルを作成します。
nano test3.cpp

/*********************************************************************
打开电脑摄像头,空格控制视频录制,ESC退出并保存视频RecordVideo.avi
*********************************************************************/
#include<iostream>
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;

int main()
{
    
    
	//打开电脑摄像头
	VideoCapture cap(0);
	if (!cap.isOpened())
	{
    
    
		cout << "error" << endl;
		waitKey(0);
		return 0;
	}

	//获得cap的分辨率
	int w = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_WIDTH));
	int h = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_HEIGHT));
	Size videoSize(w, h);
	VideoWriter writer("RecordVideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25, videoSize);
	
	Mat frame;
	int key;//记录键盘按键
	char startOrStop = 1;//0  开始录制视频; 1 结束录制视频
	char flag = 0;//正在录制标志 0-不在录制; 1-正在录制

	while (1)
	{
    
    
		cap >> frame;
		key = waitKey(100);
		if (key == 32)//按下空格开始录制、暂停录制   可以来回切换
		{
    
    
			startOrStop = 1 - startOrStop;
			if (startOrStop == 0)
			{
    
    
				flag = 1;
			}
		}
		if (key == 27)//按下ESC退出整个程序,保存视频文件到磁盘
		{
    
    
			break;
		}

		if (startOrStop == 0 && flag==1)
		{
    
    
			writer << frame;
			cout << "recording" << endl;
		}
		else if (startOrStop == 1)
		{
    
    
			flag = 0;
			cout << "end recording" << endl;
			
		}
		imshow("picture", frame);
	}
	cap.release();
	writer.release();
	destroyAllWindows();
	return 0;
}

ファイルの作成: nano test3.cpp
ここに画像の説明を挿入
コンパイル test3.cpp ファイル: g++ test3.cpp -o test3pkg-config --cflags --libs opencv
ここに画像の説明を挿入
出力:
./test3
ここに画像の説明を挿入
end record は、記録がまだ開始されていないことを意味します。
ここに画像の説明を挿入
スペースを押すと、録音は録音を開始することを意味します。
esc を押して保存し、終了します。

参考文献

クリックしてジャンプ

おすすめ

転載: blog.csdn.net/asdhnkhn/article/details/127034636