微信公众号:小白图像与视觉
关于技术、关注yysilence00
。有问题或建议,请公众号留言。
只是找个地说会话
Tutorial C++
安装C ++ OpenCV
假设使用Ubuntu-16.04(也可以使用18.04)。 我认为使用Docker很方便。
###软件包安装
$ apt install build-essential cmake checkinstall libgtk-3-dev libjpeg-dev libpng++-dev wget emacs vim sudo
###下载OpenCV
$ mkdir opencv
$ cd oepncv
$ wget https://github.com/opencv/opencv/archive/3.4.0.tar.gz
$ tar zxvf 3.4.0.tar.gz
$ cd opencv-3.4.0
$ mkdir build
$ cd build
$ cmake ..
$ make -j4
$ make install
###示例程序
将以下内容另存为sample.cpp
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
int main(int argc, const char* argv[]){
cv::Mat redImg(cv::Size(320, 240), CV_8UC3, cv::Scalar(0, 0, 255));
cv::namedWindow("red", cv::WINDOW_AUTOSIZE);
cv::imshow("red", redImg);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
然后编译
$ g++ sample.cpp -o sample -lopencv_core -lopencv_imgcodecs -lopencv_highgui
现在,如果编译通过,则文件夹中将带有* sample *。
走吧
$ ./sample
如果出现此窗口,则说明成功!
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
加载图像时使用此功能。 将其放在Mat类型变量中。 所有opencv变量都位于名为cv的命名空间中。
cv::Mat img = cv::imread("imori.jpg", cv::IMREAD_COLOR);
要读取图像的高度和宽度,
int width = img.rows;
int height = img.cols;
画像表示
使用imshow和waitKey()显示图像。 imshow的第一个参数是显示窗口的名称。 您现在不必担心。 第二个参数是您要显示的图像。 如果按任意键盘,则窗口消失。
cv::imshow("sample", img);
cv::waitKey(0);
cv::destroyAllWindows();
##像素
使用at方法篡改像素。 现在可以在x = 30,y = 20处访问像素。
std::cout << img.at<cv::Vec3b>(30,20) << std::endl;
例如,要将图像的左上半部分设为红色,
int i = 0, j = 0;
for (i = 0; i < width / 2; i++){
for (j = 0; j < height / 2; j++){
img.at<cv::Vec3b>(y,x)[0] = 0;
img.at<cv::Vec3b>(y,x)[1] = 0;
img.at<cv::Vec3b>(y,x)[2] = 255;
}
}
顺便说一句,在C ++中,如果输入的值超出[0,255]的范围,则会在编译时发送溢出警告。
例如,
for(i=0; i<width/2; i++){
for(j=0; j<height/2; j++){
img.at<cv::Vec3b>(j, i)[0] = 0;
img.at<cv::Vec3b>(j, i)[1] = 400;
img.at<cv::Vec3b>(j, i)[2] = -200;
}
}
假设x = 30,y = 20,
[0, 144, 56]
变成了。 从144 = 400-256、56 = 256-200获得图像,图像明显呈绿色。
unsigned char tmp = img.at<cv::Vec3b>(j,i);
##复制图片
如果要将图像复制到其他变量,请使用clone()方法。
cv::Mat img2 = img.clone();
##显示多张图片
要在Opencv中使用两行图像,您可以像这样使它。
cv::Mat disp;
cv::Mat tmp[3];
tmp[0] = img;
tmp[1] = cv::Mat (cv::Size(10, height), CV_8UC3, cv::Scalar(0,0,0));
tmp[2] = img2;
cv::hconcat(tmp, 3, disp);
cv::imshow("sample", disp);
cv::waitKey(0);
现在看起来像这样。
##保存图片
保存时,请使用cv :: imwrite()方法。
cv::imshow("out.jpg", disp);
##练习题
让我们交换并在图像的左半部分显示R和B。
回答例
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
int main(int argc, const char* argv[]){
cv::Mat img = cv::imread("imori.jpg", cv::IMREAD_COLOR);
int width = img.rows;
int height = img.cols;
cv::Mat out = img.clone();
for(int i=0; i<width/2; i++){
for(int j=0; j<height/2; j++){
unsigned char tmp = out.at<cv::Vec3b>(j, i)[0];
out.at<cv::Vec3b>(j, i)[0] = out.at<cv::Vec3b>(j, i)[2];
out.at<cv::Vec3b>(j, i)[2] = tmp;
}
}
cv::imwrite("out.jpg", out);
cv::imshow("sample", out);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
我的github >> https://github.com/yanyong666
这样就完成了本教程。
然后解决问题! ! ! !
更多请参考: