Tutorial of OpenCV programming. Windows Visual Studio C/C++ programming. Quick learning of basic knowledge of OpenCV programming.
Check "Desktop development with C++" at install.
Run downloader, and it is uncompressed. Put the uncompressed folder to the directory you want to install such as "C:\".
Open [Control Panel]. [System and Security]-[System]-[Advanced system settings]-[Environment Variables]. [System variables]-[PATH], and [Edit]. [New], and write OpenCV install directory such as "\build\x64\vc15\bin".
Run [Visual Studio]. [Create a new project]. [Console App] (C++) (Windows) (Console). Choose the folder you want to save. Write your project's name.
At [Solution platform], choose [x64].
[Project]-[Properties]. [Configuration Properties]-[C/C++]-[Precompiled Headers]-[Precompiled Header], choose [Not Using Precompiled Headers].
[Build]-[Build Solution]. [1 succeeded] appears if build success.
[Debug]-[Start Debugging].
[Press any key to close this window . . .] appears, and press any key.
#include <iostream>
using namespace std;
int main()
{
cout << "Visual C++ sample" << endl;
}
[Project]-[Properties].
[Configuration Properties]-[C/C++]-[General]-[Additional Include Directories], write OpenCV include directory such as "\build\include".
[Configuration Properties]-[Linker]-[General]-[Additional Library Directories], write OpenCV lib directory such as "\build\x64\vc15\lib".
#if _DEBUG
#pragma comment(lib, "opencv_world430d.lib")
#else
#pragma comment(lib, "opencv_world430.lib")
#endif
#include <iostream>
using namespace std;
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat mata = Mat::zeros(2, 2,
CV_64F);
Mat vecx = Mat::zeros(2, 1,
CV_64F);
Mat vecb;
mata.at<double>(0, 0) = 1.0;
mata.at<double>(0, 1) = 2.0;
mata.at<double>(1, 0) = 3.0;
mata.at<double>(1, 1) = 4.0;
vecx.at<double>(0, 0) = 2.0;
vecx.at<double>(1, 0) = 1.0;
vecb = mata * vecx;
cout << "a=" << endl << mata <<
endl << endl;
cout << "x=" << endl << vecx <<
endl << endl;
cout << "b=" << endl << vecb <<
endl << endl;
return 0;
}
#if _DEBUG
#pragma comment(lib, "opencv_world430d.lib")
#else
#pragma comment(lib, "opencv_world430.lib")
#endif
#include <iostream>
using namespace std;
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = Mat::zeros(480, 640,
CV_8UC3);
line(img, Point(100, 100),
Point(200, 100), Scalar(0, 0, 255));
rectangle(img, Point(100, 200),
Point(200, 300), Scalar(0, 255, 0));
circle(img, Point(400, 200), 50,
Scalar(255, 0, 0));
imshow("opencv program", img);
waitKey();
return 0;
}
#if _DEBUG
#pragma comment(lib, "opencv_world430d.lib")
#else
#pragma comment(lib, "opencv_world430.lib")
#endif
#include <iostream>
using namespace std;
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat input = imread("meal41.jpg",
IMREAD_COLOR);
if (!input.data) {
cout <<
"cannot open input file" << endl; return 1;
}
Mat output = Mat(input.rows,
input.cols, CV_8UC3);
for (int y = 0; y < input.rows;
y++) {
for (int x
= 0; x < input.cols; x++) {
unsigned char r = input.at<Vec3b>(y, x)[2];
unsigned char g = input.at<Vec3b>(y, x)[1];
unsigned char b = input.at<Vec3b>(y, x)[0];
output.at<Vec3b>(y, x)[2] = (unsigned char)(0.9 * (double)r);
output.at<Vec3b>(y, x)[1] = (unsigned char)(0.7 * (double)g);
output.at<Vec3b>(y, x)[0] = (unsigned char)(0.4 * (double)b);
}
}
imwrite("output.bmp", output);
return 0;
}
# -*- coding: utf-8 -*-
import cv2
def main():
input = cv2.imread("meal41.jpg")
if input is None:
print('cannot open input file')
return
row, col, channel = input.shape
output = input.copy()
for y in range(0, row):
for x in
range(0, col):
r = input[y, x, 2]
g = input[y, x, 1]
b = input[y, x, 0]
output[y, x, 2] = 0.9 * r
output[y, x, 1] = 0.7 * g
output[y, x, 0] = 0.4 * b
cv2.imwrite("output.bmp", output)
if __name__ == '__main__':
main()
input = imread('meal41.jpg');
[row,col,channel]=size(input);
output=input;
for y=1:row
for x=1:col
r=input(y,x,1);
g=input(y,x,2);
b=input(y,x,3);
output(y,x,1)=0.9*r;
output(y,x,2)=0.7*g;
output(y,x,3)=0.4*b;
end
end
imwrite(output, 'output.bmp');
#if _DEBUG
#pragma comment(lib, "opencv_world430d.lib")
#else
#pragma comment(lib, "opencv_world430.lib")
#endif
#include <iostream>
using namespace std;
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat input = imread("grayscale.jpg",
IMREAD_GRAYSCALE);
if (!input.data) {
cout <<
"cannot open input file" << endl; return 1;
}
Mat output = Mat(input.rows,
input.cols, CV_8U);
for (int y = 0; y < input.rows;
y++) {
for (int x
= 0; x < input.cols; x++) {
int num = 0;
double val = 0.0;
for (int yy = y - 1; yy <= y + 1; yy++) {
for (int xx = x - 1; xx <= x + 1; xx++) {
if (xx >= 0 && yy >= 0 && xx < input.cols && yy < input.rows) {
val += (double)input.at<uchar>(yy, xx);
num++;
}
}
}
output.at<uchar>(y, x) = (unsigned char)(val / (double)num);
}
}
imwrite("output.bmp", output);
return 0;
}
input0.bmp
input1.bmp
input2.bmp
#if _DEBUG
#pragma comment(lib, "opencv_world430d.lib")
#else
#pragma comment(lib, "opencv_world430.lib")
#endif
#include <iostream>
#include <fstream>
using namespace std;
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat input[3];
input[0] = imread("input0.bmp",
IMREAD_GRAYSCALE);
input[1] = imread("input1.bmp",
IMREAD_GRAYSCALE);
input[2] = imread("input2.bmp",
IMREAD_GRAYSCALE);
if (!input[0].data ||
!input[1].data || !input[2].data) {
cout <<
"cannot open input file" << endl; return 1;
}
int rows = input[0].rows;
int cols = input[0].cols;
Mat matl = Mat::zeros(3, 3,
CV_64F);
matl.at<double>(0, 0) =
1.58546E-17;
matl.at<double>(0, 1) =
0.258819045;
matl.at<double>(0, 2) =
0.965925826;
matl.at<double>(1, 0) =
-0.353553391;
matl.at<double>(1, 1) =
-0.353553391;
matl.at<double>(1, 2) =
0.866025404;
matl.at<double>(2, 0) =
0.353553391;
matl.at<double>(2, 1) =
-0.353553391;
matl.at<double>(2, 2) =
0.866025404;
Mat invl = matl.inv();
Mat output = Mat(rows, cols,
CV_32FC3);
for (int y = 0; y < rows; y++) {
for (int x
= 0; x < cols; x++) {
Mat veci = Mat::zeros(3, 1, CV_64F);
veci.at<double>(0, 0) = (double)input[0].at<uchar>(y, x);
veci.at<double>(1, 0) = (double)input[1].at<uchar>(y, x);
veci.at<double>(2, 0) = (double)input[2].at<uchar>(y, x);
Mat vecn = invl * veci;
double r = norm(vecn);
if (r > 1.0e-15) {
vecn.at<double>(0, 0) /= r;
vecn.at<double>(1, 0) /= r;
vecn.at<double>(2, 0) /= r;
}
output.at<Vec3f>(y, x)[0] = (float)vecn.at<double>(0, 0);
output.at<Vec3f>(y, x)[1] = (float)vecn.at<double>(1, 0);
output.at<Vec3f>(y, x)[2] = (float)vecn.at<double>(2, 0);
}
}
ofstream fout;
fout.open("normal.float", ios::out
| ios::trunc | ios::binary);
for (int y = 0; y < rows; y++) {
for (int x
= 0; x < cols; x++) {
for (int i = 0; i < 3; i++) {
fout.write((char*)&output.at<Vec3f>(y, x)[i], sizeof(float));
}
}
}
fout.close();
return 0;
}
#if _DEBUG
#pragma comment(lib, "opencv_world430d.lib")
#else
#pragma comment(lib, "opencv_world430.lib")
#endif
#include <iostream>
using namespace std;
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat input[2];
input[0] = imread("image1.jpg",
IMREAD_COLOR);
input[1] = imread("image2.jpg",
IMREAD_COLOR);
if (!input[0].data ||
!input[1].data) {
cout <<
"cannot open input file" << endl; return 1;
}
Mat output[2];
output[0] = input[0].clone();
output[1] = input[1].clone();
vector<vector<Vec3f>> list3d;
vector<vector<Vec2f>> list2d;
vector<Vec3f> item3d[2];
vector<Vec2f> item2d[2];
item3d[0].push_back(Vec3f(1.0f,
0.0f, 0.0f));
item2d[0].push_back(Vec2f(234.0f,
306.0f));
item3d[0].push_back(Vec3f(0.0f,
1.0f, 0.0f));
item2d[0].push_back(Vec2f(448.0f,
265.0f));
item3d[0].push_back(Vec3f(0.0f,
0.0f, 1.0f));
item2d[0].push_back(Vec2f(320.0f,
90.0f));
item3d[0].push_back(Vec3f(1.0f,
1.0f, 0.0f));
item2d[0].push_back(Vec2f(391.0f,
370.0f));
item3d[0].push_back(Vec3f(0.0f,
1.0f, 1.0f));
item2d[0].push_back(Vec2f(475.0f,
121.0f));
item3d[0].push_back(Vec3f(1.0f,
0.0f, 1.0f));
item2d[0].push_back(Vec2f(225.0f,
147.0f));
item3d[0].push_back(Vec3f(1.0f,
1.0f, 1.0f));
item2d[0].push_back(Vec2f(413.0f,
196.0f));
item3d[1].push_back(Vec3f(1.0f,
0.0f, 0.0f));
item2d[1].push_back(Vec2f(174.0f,
249.0f));
item3d[1].push_back(Vec3f(0.0f,
1.0f, 0.0f));
item2d[1].push_back(Vec2f(384.0f,
276.0f));
item3d[1].push_back(Vec3f(0.0f,
0.0f, 1.0f));
item2d[1].push_back(Vec2f(298.0f,
69.0f));
item3d[1].push_back(Vec3f(1.0f,
1.0f, 0.0f));
item2d[1].push_back(Vec2f(244.0f,
359.0f));
item3d[1].push_back(Vec3f(0.0f,
1.0f, 1.0f));
item2d[1].push_back(Vec2f(404.0f,
154.0f));
item3d[1].push_back(Vec3f(1.0f,
0.0f, 1.0f));
item2d[1].push_back(Vec2f(138.0f,
125.0f));
item3d[1].push_back(Vec3f(1.0f,
1.0f, 1.0f));
item2d[1].push_back(Vec2f(226.0f,
239.0f));
list3d.push_back(item3d[0]);
list3d.push_back(item3d[1]);
list2d.push_back(item2d[0]);
list2d.push_back(item2d[1]);
Size imgsize = Size(input[0].cols,
input[0].rows);
Mat intrinsic = (Mat_<double>(3, 3)
<<
1000.0,
0.0, (double)input[0].cols / 2.0,
0.0,
1000.0, (double)input[0].rows / 2.0,
0.0, 0.0,
1.0);
Mat dist = Mat::zeros(1, 4,
CV_64F);
vector<Mat> vecr;
vector<Mat> vect;
calibrateCamera(list3d, list2d,
imgsize, intrinsic, dist, vecr, vect,
CALIB_USE_INTRINSIC_GUESS | CALIB_FIX_PRINCIPAL_POINT | CALIB_FIX_ASPECT_RATIO |
CALIB_ZERO_TANGENT_DIST |
CALIB_FIX_K1 | CALIB_FIX_K2 | CALIB_FIX_K3 | CALIB_FIX_K4 | CALIB_FIX_K5 |
CALIB_FIX_K6);
cout << "カメラ内部行列" << endl;
cout << intrinsic << endl;
cout << endl;
cout << "平行移動ベクトル" << endl;
cout << vect.at(0) << endl;
cout << vect.at(1) << endl;
cout << endl;
Mat matr[2];
Rodrigues(vecr.at(0), matr[0]);
Rodrigues(vecr.at(1), matr[1]);
cout << "回転行列" << endl;
cout << matr[0] << endl;
cout << matr[1] << endl;
cout << endl;
for (int c = 0; c < 2; c++) {
for (int y
= -1; y <= 2; y++) {
Mat point3d1 = Mat::zeros(3, 1, CV_64F);
point3d1.at<double>(0, 0) = -1.0;
point3d1.at<double>(1, 0) = (double)y;
point3d1.at<double>(2, 0) = 0.0;
point3d1 = intrinsic * (matr[c] * point3d1 + vect.at(c));
Point point2d1 = Point(
(int)(point3d1.at<double>(0, 0) / point3d1.at<double>(2, 0)),
(int)(point3d1.at<double>(1, 0) / point3d1.at<double>(2, 0)));
Mat point3d2 = Mat::zeros(3, 1, CV_64F);
point3d2.at<double>(0, 0) = 2.0;
point3d2.at<double>(1, 0) = (double)y;
point3d2.at<double>(2, 0) = 0.0;
point3d2 = intrinsic * (matr[c] * point3d2 + vect.at(c));
Point point2d2 = Point(
(int)(point3d2.at<double>(0, 0) / point3d2.at<double>(2, 0)),
(int)(point3d2.at<double>(1, 0) / point3d2.at<double>(2, 0)));
line(output[c], point2d1, point2d2, Scalar(0, 0, 255), 3, LINE_AA);
}
for (int x
= -1; x <= 2; x++) {
Mat point3d1 = Mat::zeros(3, 1, CV_64F);
point3d1.at<double>(0, 0) = (double)x;
point3d1.at<double>(1, 0) = -1.0;
point3d1.at<double>(2, 0) = 0.0;
point3d1 = intrinsic * (matr[c] * point3d1 + vect.at(c));
Point point2d1 = Point(
(int)(point3d1.at<double>(0, 0) / point3d1.at<double>(2, 0)),
(int)(point3d1.at<double>(1, 0) / point3d1.at<double>(2, 0)));
Mat point3d2 = Mat::zeros(3, 1, CV_64F);
point3d2.at<double>(0, 0) = (double)x;
point3d2.at<double>(1, 0) = 2.0;
point3d2.at<double>(2, 0) = 0.0;
point3d2 = intrinsic * (matr[c] * point3d2 + vect.at(c));
Point point2d2 = Point(
(int)(point3d2.at<double>(0, 0) / point3d2.at<double>(2, 0)),
(int)(point3d2.at<double>(1, 0) / point3d2.at<double>(2, 0)));
line(output[c], point2d1, point2d2, Scalar(0, 0, 255), 3, LINE_AA);
}
}
imwrite("output1.jpg", output[0]);
imwrite("output2.jpg", output[1]);
return 0;
}
http://non117.hatenablog.com/entry/2014/12/20/175053