C ++ OpenCV

微信公众号:小白图像与视觉
关于技术、关注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

如果出现此窗口,则说明成功!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-70GRCB6z-1574167259376)(https://note.youdao.com/yws/api/personal/file/WEB1554c0755522a3c2c361bfd065c03943?method=download&shareKey=b6977b79a8517fe091423abc182a60aa)]
接下来,我们将说明图像处理的基本操作。 (如果您已经知道,请跳过此问题!) ##载入图片 当将Oepncv与C ++一起使用时,必须将其包括在内。
#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;
  }
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8VIhnDNS-1574167259385)(https://note.youdao.com/yws/api/personal/file/WEBd454b2c3fa60c120fd2802d584f1d6bf?method=download&shareKey=78320ddb304a8fbab11e2eca03e834b4)]

顺便说一句,在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获得图像,图像明显呈绿色。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZGerRlto-1574167259388)(https://note.youdao.com/yws/api/personal/file/WEB6841cdd34501d9a70a7d7af1d806c178?method=download&shareKey=cb11f4748c289584d5ef69a7d0970ff7)]
img.at (j,i)包含无符号字符类型值,因此您必须执行类似的操作才能获得RGB值。
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);

现在看起来像这样。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tSxokzny-1574167259389)(https://note.youdao.com/yws/api/personal/file/WEB2bb9ad776540dc63ef6aaded97afa33b?method=download&shareKey=12adbef27a04626d4c1a6366c782420e)]

##保存图片

保存时,请使用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
这样就完成了本教程。

然后解决问题! ! ! !

更多请参考

weixin

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值