当前位置:   article > 正文

OpenCV项目实战_opencv实战项目

opencv实战项目

一、将手机当做摄像头和opencv连接

1.首先在手机上下载【ip摄像头】

2.

  1. #include <iostream>
  2. #include<opencv2/highgui.hpp>;
  3. #include<opencv2/imgcodecs.hpp>;
  4. #include<opencv2/imgproc.hpp>;
  5. #include <opencv2/objdetect.hpp>;
  6. using namespace cv;
  7. using namespace std;
  8. int main() {
  9. VideoCapture capture;
  10. Mat frame;
  11. //注意下面的连接部分,admin:admin(账号密码打开软件后会提示,也可以设置),
  12. //@符号之后的是局域网ip地址(打开app后,点击下方“打开IP摄像头服务器”,会有显示局域网ip)
  13. //即:http://<USERNAME>:<PASSWORD>@<IP_ADDRESS>/<the value of src>
  14. capture.open("http://123:123@192.168.0.8:8081/");
  15. while (1)
  16. {
  17. capture >> frame; //读取当前每一帧画面
  18. imshow("读取视频", frame); //显示当前图像帧
  19. waitKey(10); //延时30ms
  20. }
  21. return 0;
  22. }

代码中用到了登陆名,密码,ip,端口号,手机端软件都会告诉你,而且还可以设置,图像的质量、格式也可以设置,挺不错的一款软件。

二、摄像头人脸检测

  1. #include <iostream>
  2. #include<opencv2/highgui.hpp>;
  3. #include<opencv2/imgcodecs.hpp>;
  4. #include<opencv2/imgproc.hpp>;
  5. #include <opencv2/objdetect.hpp>;
  6. using namespace cv;
  7. using namespace std;
  8. int main() {
  9. VideoCapture capture;
  10. Mat img;
  11. capture.open("http://123:123@192.168.0.8:8081/");
  12. //创建级联,人脸检测的实际代码
  13. CascadeClassifier faceCascade;
  14. faceCascade.load("D:/Resources/haarcascade_frontalface_default.xml");
  15. vector<Rect> faces;
  16. while (true)
  17. {
  18. capture >> img;
  19. //人脸检测
  20. faceCascade.detectMultiScale(img, faces, 1.1, 10);
  21. for (int i = 0; i < faces.size(); i++)
  22. {
  23. rectangle(img, faces[i].tl(), faces[i].br(), Scalar(255, 0, 255), 3);
  24. }
  25. imshow("Image", img);
  26. waitKey(5);
  27. }
  28. }

三、虚拟画家

大体思路:找到颜色,获取轮廓,画圆

1.通过摄像头找到自己想要提取的颜色

  1. #include <iostream>
  2. #include<opencv2/highgui.hpp>;
  3. #include<opencv2/imgcodecs.hpp>;
  4. #include<opencv2/imgproc.hpp>;
  5. #include <opencv2/objdetect.hpp>;
  6. using namespace cv;
  7. using namespace std;
  8. int hmin = 0, smin = 0, vmin = 0;
  9. int hmax = 179, smax = 255, vmax = 255;
  10. VideoCapture capture;
  11. Mat frame, imgHSV, mask;
  12. int main() {
  13. namedWindow("Trackbars", (600, 200));
  14. createTrackbar("hue min", "Trackbars", &hmin, 179);
  15. createTrackbar("hue max", "Trackbars", &hmax, 179);
  16. createTrackbar("sat min", "Trackbars", &smin, 255);
  17. createTrackbar("sat max", "Trackbars", &smax, 255);
  18. createTrackbar("val min", "Trackbars", &vmin, 255);
  19. createTrackbar("val max", "Trackbars", &vmax, 255);
  20. capture.open("http://123:123@192.168.0.8:8081/");
  21. while (1)
  22. {
  23. capture >> frame;
  24. //转换为色相空间
  25. cvtColor(frame, imgHSV, COLOR_BGR2HSV);
  26. Scalar lower(hmin, smin, vmin);
  27. Scalar upper(hmax, smax, vmax);
  28. inRange(imgHSV, lower, upper, mask);
  29. imshow("提色", frame);
  30. imshow("正常", mask);
  31. waitKey(30);
  32. }
  33. return 0;
  34. }

(大体搞了下但我的环境很杂 所以效果不是特别的好)

2.获取提色的蒙版

  1. #include <iostream>
  2. #include<opencv2/highgui.hpp>;
  3. #include<opencv2/imgcodecs.hpp>;
  4. #include<opencv2/imgproc.hpp>;
  5. #include <opencv2/objdetect.hpp>;
  6. using namespace cv;
  7. using namespace std;
  8. VideoCapture capture;
  9. Mat frame;
  10. //这里是按照从min到max
  11. vector<vector<int>> myColors{ {90,186,0,179,255,255},//粉色
  12. {124,48,117,143,170,255} };//紫色
  13. //现在还要定义显示什么颜色,当检测到上面这些的时候 我们就显示这些颜色
  14. vector<vector<int>> myColorValues{ {0,255,0},//绿色
  15. {255,0,255} };//紫色
  16. void findColor(Mat img) {
  17. Mat imgHSV;
  18. cvtColor(img, imgHSV, COLOR_BGR2HSV);
  19. for (int i = 0; i < myColors.size(); i++)
  20. {
  21. Scalar lower(myColors[i][0], myColors[i][1], myColors[i][2]);
  22. Scalar upper(myColors[i][3], myColors[i][4], myColors[i][5]);
  23. Mat mask;
  24. inRange(imgHSV, lower, upper, mask);
  25. imshow(to_string(i), mask);
  26. }
  27. }
  28. int main() {
  29. capture.open("http://123:123@192.168.0.8:8081/");
  30. while (1)
  31. {
  32. capture >> frame;
  33. findColor(frame);
  34. imshow("读取视频", frame);
  35. waitKey(10);
  36. }
  37. return 0;
  38. }

当视频里出现相应颜色的时候 才会显示相应的蒙版

3.现在可以从这个蒙版获取精确的点(画出蒙版轮廓)

  1. #include <iostream>
  2. #include<opencv2/highgui.hpp>;
  3. #include<opencv2/imgcodecs.hpp>;
  4. #include<opencv2/imgproc.hpp>;
  5. #include <opencv2/objdetect.hpp>;
  6. using namespace cv;
  7. using namespace std;
  8. VideoCapture capture;
  9. Mat frame;
  10. //这里是按照从min到max
  11. vector<vector<int>> myColors{ {90,186,0,179,255,255},//粉色
  12. {124,48,117,143,170,255} };//紫色
  13. //现在还要定义显示什么颜色,当检测到上面这些的时候 我们就显示这些颜色
  14. vector<vector<int>> myColorValues{ {0,255,0},//绿色
  15. {255,0,255} };//紫色
  16. void getContours(Mat imgDil) {
  17. vector<vector<Point>> contours;
  18. vector<Vec4i> hierarchy;
  19. findContours(imgDil, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
  20. for (int i = 0; i < contours.size(); i++)
  21. {
  22. int area = contourArea(contours[i]);
  23. if (area > 1000) {
  24. //打印轮廓
  25. drawContours(frame, contours, i, Scalar(255, 0, 255), 2);
  26. }
  27. }
  28. }
  29. void findColor(Mat img) {
  30. Mat imgHSV;
  31. cvtColor(img, imgHSV, COLOR_BGR2HSV);
  32. for (int i = 0; i < myColors.size(); i++)
  33. {
  34. Scalar lower(myColors[i][0], myColors[i][1], myColors[i][2]);
  35. Scalar upper(myColors[i][3], myColors[i][4], myColors[i][5]);
  36. Mat mask;
  37. inRange(imgHSV, lower, upper, mask);
  38. /*imshow(to_s
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/650399
推荐阅读
相关标签
  

闽ICP备14008679号