您当前的位置: 首页 >  opencv

鱼儿-1226

暂无认证

  • 0浏览

    0关注

    1100博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

opencv 绿幕视频背景替换

鱼儿-1226 发布时间:2020-07-29 10:13:24 ,浏览量:0

基于hsv颜色空间的实时背景替换: 

 
  1. #include

  2. using namespace cv;

  3. Mat replace_and_blend(Mat &frame, Mat&mask);

  4. Mat background,frame, hsv, mask,result;

  5. int main(int arc, char** argv) {

  6. background = imread("2.jpg");

  7. namedWindow("input", CV_WINDOW_AUTOSIZE);

  8. imshow("src", background);

  9.  
  10. VideoCapture capture;

  11. capture.open("1.mp4");

  12. while (capture.read(frame)) {

  13. imshow("input", frame);

  14. cvtColor(frame, hsv, CV_BGR2HSV);

  15. inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);//颜色过滤,得到mask绿色部分为1,其它部分都为0

  16. imshow("mask", mask);

  17. Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3));

  18. morphologyEx(mask, mask, MORPH_DILATE, kernel);

  19. GaussianBlur(mask, mask, Size(3, 3), 0, 0);//0,0会根据Size自动算的

  20.  
  21. result = replace_and_blend(frame, mask);

  22.  
  23. char c = waitKey(1);

  24. if (c == 27) {

  25. break;

  26. }

  27. imshow("input", frame);

  28. imshow("result", result);

  29. }

  30. waitKey(0);

  31. return 0;

  32. }

  33.  
  34. Mat replace_and_blend(Mat &frame, Mat&mask) {

  35. result = Mat::zeros(frame.size(), frame.type());

  36. int h = frame.rows;

  37. int w = frame.cols;

  38. int dims = frame.channels();

  39.  
  40. int m ;

  41. double wt ;

  42. int b , g, r;

  43. int b1, g1, r1;

  44. int b2 , g2, r2 ;

  45. //指针操作速度最快,直接访问地址

  46. for (int row = 0; row < h; row++) {

  47. uchar* current = frame.ptr(row);

  48. uchar* bgrow = background.ptr(row);

  49. uchar* maskrow = mask.ptr(row);

  50. uchar* targetrow = result.ptr(row);

  51. for (int col = 0; col < w; col++) {

  52. m = *maskrow++;

  53. if (m == 255) {//背景

  54. *targetrow++ = *bgrow++;

  55. *targetrow++ = *bgrow++;

  56. *targetrow++ = *bgrow++;

  57. current += 3;

  58. }

  59. else if (m == 0) {//前景

  60. *targetrow++ = *current++;

  61. *targetrow++ = *current++;

  62. *targetrow++ = *current++;

  63. bgrow += 3;

  64. }

  65. else {

  66. b1 = *bgrow++;

  67. g1 = *bgrow++;

  68. r1 = *bgrow++;

  69.  
  70. b2 = *current++;

  71. g2 = *current++;

  72. r2 = *current++;

  73.  
  74. wt = m/ 255.0;

  75. b = wt*b1 + (1 - wt)*b2;

  76. g = wt*g1 + (1 - wt)*g2;

  77. r = wt*r1 + (1 - wt)*r2;

  78.  
  79. *targetrow++ = b;

  80. *targetrow++ = g;

  81. *targetrow++ = r;

  82. }

  83. }

  84. }

  85. return result;

  86. }

 

参考文献:https://blog.csdn.net/huanghuangjin/article/details/81461040 

关注
打赏
1604459285
查看更多评论
立即登录/注册

微信扫码登录

0.0395s