opencv图像读取、显示、视频播放等 opencvGPU接口图像add、sub、颜色空间转换、阈值操作等
1 opencv 图像读取
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main ( int argc, char * * argv)
{
Mat img = imread ( "images/cameraman.tif" , 0 ) ;
if ( img. empty ( ) )
{
cout << "Could not open an image" << endl;
return - 1 ;
}
String win_name = "My First Opencv Program" ;
namedWindow ( win_name) ;
imshow ( win_name, img) ;
waitKey ( 0 ) ;
destroyWindow ( win_name) ;
return 0 ;
}
2创建单通道 256x256 0值 矩阵,黑色图
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main ( int argc, char * * argv)
{
Mat img ( 256 , 256 , CV_8UC1, Scalar ( 0 ) ) ;
String win_name = "Blank Image" ;
namedWindow ( win_name) ;
imshow ( win_name, img) ;
waitKey ( 0 ) ;
destroyWindow ( win_name) ;
return 0 ;
}
3 创建三通道 256x256 blue color 图
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main ( int argc, char * * argv)
{
Mat img ( 256 , 256 , CV_8UC3, Scalar ( 255 , 0 , 0 ) ) ;
String win_name = "Blank Blue Color Image" ;
namedWindow ( win_name) ;
imshow ( win_name, img) ;
waitKey ( 0 ) ;
destroyWindow ( win_name) ;
return 0 ;
}
4 opencv显示图形
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main ( int argc, char * * argv)
{
Mat img ( 512 , 512 , CV_8UC3, Scalar ( 0 , 0 , 0 ) ) ;
line ( img, Point ( 0 , 0 ) , Point ( 511 , 511 ) , Scalar ( 0 , 255 , 0 ) , 7 ) ;
rectangle ( img, Point ( 384 , 0 ) , Point ( 510 , 128 ) , Scalar ( 255 , 255 , 0 ) , 5 ) ;
circle ( img, Point ( 447 , 63 ) , 63 , Scalar ( 0 , 0 , 255 ) , - 1 ) ;
ellipse ( img, Point ( 256 , 256 ) , Point ( 100 , 100 ) , 0 , 0 , 180 , 255 , - 1 ) ;
putText ( img, "OpenCV!" , Point ( 10 , 500 ) , FONT_HERSHEY_SIMPLEX, 3 ,
Scalar ( 255 , 255 , 255 ) , 5 , 8 ) ;
String win_name = "Blank Blue Color Image" ;
namedWindow ( win_name) ;
imshow ( win_name, img) ;
waitKey ( 0 ) ;
destroyWindow ( win_name) ;
return 0 ;
}
5 播放视频文件
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main ( int argc, char * argv[ ] )
{
VideoCapture cap ( "images/rhinos.avi" ) ;
if ( cap. isOpened ( ) == false)
{
cout << "Cannot open the video file" << endl;
return - 1 ;
}
cout<< "Press Q to Quit" << endl;
String win_name = "First Video" ;
namedWindow ( win_name) ;
while ( true)
{
Mat frame;
bool flag = cap. read ( frame) ;
if ( flag == false)
{
break ;
}
imshow ( win_name, frame) ;
if ( waitKey ( 100 ) == 'q' )
{
break ;
}
}
destroyWindow ( win_name) ;
return 0 ;
}
6 打开摄像头,播放拍摄到的图像
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main ( int argc, char * argv[ ] )
{
VideoCapture cap ( 0 ) ;
if ( cap. isOpened ( ) == false)
{
cout << "Cannot open Webcam" << endl;
return - 1 ;
}
double fps = cap. get ( CAP_PROP_FPS) ;
cout << "Frames per seconds : " << fps << endl;
cout<< "Press Q to Quit" << endl;
String win_name = "Webcam Video" ;
namedWindow ( win_name) ;
while ( true)
{
Mat frame;
bool flag = cap. read ( frame) ;
imshow ( win_name, frame) ;
if ( waitKey ( 1 ) == 'q' )
{
break ;
}
}
return 0 ;
}
7 opencv GPU 接口 图像相加
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( int argc, char * argv[ ] )
{
cv: : Mat h_img1 = cv: : imread ( "images/cameraman.tif" ) ;
cv: : Mat h_img2 = cv: : imread ( "images/circles.png" ) ;
cv: : Mat h_result1;
cv: : cuda: : GpuMat d_result1, d_img1, d_img2;
d_img1. upload ( h_img1) ;
d_img2. upload ( h_img2) ;
cv: : cuda: : add ( d_img1, d_img2, d_result1) ;
d_result1. download ( h_result1) ;
cv: : imshow ( "Image1 " , h_img1) ;
cv: : imshow ( "Image2 " , h_img2) ;
cv: : imshow ( "Result addition " , h_result1) ;
cv: : imwrite ( "images/result_add.png" , h_result1) ;
cv: : waitKey ( ) ;
return 0 ;
}
8opencv GPU 接口 图像相减
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( int argc, char * argv[ ] )
{
cv: : Mat h_img1 = cv: : imread ( "images/cameraman.tif" ) ;
cv: : Mat h_img2 = cv: : imread ( "images/circles.png" ) ;
cv: : Mat h_result1;
cv: : cuda: : GpuMat d_result1, d_img1, d_img2;
d_img1. upload ( h_img1) ;
d_img2. upload ( h_img2) ;
cv: : cuda: : subtract ( d_img1, d_img2, d_result1) ;
d_result1. download ( h_result1) ;
cv: : imshow ( "Image1 " , h_img1) ;
cv: : imshow ( "Image2 " , h_img2) ;
cv: : imshow ( "Result Subtraction " , h_result1) ;
cv: : imwrite ( "images/result_add.png" , h_result1) ;
cv: : waitKey ( ) ;
return 0 ;
}
9 opencv GPU 接口 图像 加权叠加
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( int argc, char * argv[ ] )
{
cv: : Mat h_img1 = cv: : imread ( "images/cameraman.tif" ) ;
cv: : Mat h_img2 = cv: : imread ( "images/circles.png" ) ;
cv: : Mat h_result1;
cv: : cuda: : GpuMat d_result1, d_img1, d_img2;
d_img1. upload ( h_img1) ;
d_img2. upload ( h_img2) ;
cv: : cuda: : addWeighted ( d_img1, 0.7 , d_img2, 0.3 , 0 , d_result1) ;
d_result1. download ( h_result1) ;
cv: : imshow ( "Image1 " , h_img1) ;
cv: : imshow ( "Image2 " , h_img2) ;
cv: : imshow ( "Result blending " , h_result1) ;
cv: : imwrite ( "images/result_add.png" , h_result1) ;
cv: : waitKey ( ) ;
return 0 ;
}
10 opencv GPU 接口 图像 二进制操作 与 或 异或 非
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( int argc, char * argv[ ] )
{
cv: : Mat h_img1 = cv: : imread ( "images/circles.png" ) ;
cv: : cuda: : GpuMat d_result1, d_img1;
cv: : Mat h_result1;
d_img1. upload ( h_img1) ;
cv: : cuda: : bitwise_not ( d_img1, d_result1) ;
d_result1. download ( h_result1) ;
cv: : imshow ( "Result inversion " , h_result1) ;
cv: : imwrite ( "images/result_inversion.png" , h_result1) ;
cv: : waitKey ( ) ;
return 0 ;
}
11 opencv GPU 接口 图像 颜色空间转换
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( int argc, char * argv[ ] )
{
cv: : Mat h_img1 = cv: : imread ( "images/autumn.tif" ) ;
cv: : cuda: : GpuMat d_result1, d_result2, d_result3, d_result4, d_img1;
d_img1. upload ( h_img1) ;
cv: : cuda: : cvtColor ( d_img1, d_result1, cv: : COLOR_BGR2GRAY) ;
cv: : cuda: : cvtColor ( d_img1, d_result2, cv: : COLOR_BGR2RGB) ;
cv: : cuda: : cvtColor ( d_img1, d_result3, cv: : COLOR_BGR2HSV) ;
cv: : cuda: : cvtColor ( d_img1, d_result4, cv: : COLOR_BGR2YCrCb) ;
cv: : Mat h_result1, h_result2, h_result3, h_result4;
d_result1. download ( h_result1) ;
d_result2. download ( h_result2) ;
d_result3. download ( h_result3) ;
d_result4. download ( h_result4) ;
cv: : imshow ( "Result in Gray " , h_result1) ;
cv: : imshow ( "Result in RGB" , h_result2) ;
cv: : imshow ( "Result in HSV " , h_result3) ;
cv: : imshow ( "Result in YCrCb " , h_result4) ;
cv: : waitKey ( ) ;
return 0 ;
}
12 opencv GPU 接口 图像 阈值操作
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( int argc, char * argv[ ] )
{
cv: : Mat h_img1 = cv: : imread ( "images/cameraman.tif" , 0 ) ;
cv: : cuda: : GpuMat d_result1, d_result2, d_result3, d_result4, d_result5, d_img1;
d_img1. upload ( h_img1) ;
cv: : cuda: : threshold ( d_img1, d_result1, 128.0 , 255.0 , cv: : THRESH_BINARY) ;
cv: : cuda: : threshold ( d_img1, d_result2, 128.0 , 255.0 , cv: : THRESH_BINARY_INV) ;
cv: : cuda: : threshold ( d_img1, d_result3, 128.0 , 255.0 , cv: : THRESH_TRUNC) ;
cv: : cuda: : threshold ( d_img1, d_result4, 128.0 , 255.0 , cv: : THRESH_TOZERO) ;
cv: : cuda: : threshold ( d_img1, d_result5, 128.0 , 255.0 , cv: : THRESH_TOZERO_INV) ;
cv: : Mat h_result1, h_result2, h_result3, h_result4, h_result5;
d_result1. download ( h_result1) ;
d_result2. download ( h_result2) ;
d_result3. download ( h_result3) ;
d_result4. download ( h_result4) ;
d_result5. download ( h_result5) ;
cv: : imshow ( "Result Threshhold binary " , h_result1) ;
cv: : imshow ( "Result Threshhold binary inverse " , h_result2) ;
cv: : imshow ( "Result Threshhold truncated " , h_result3) ;
cv: : imshow ( "Result Threshhold truncated to zero " , h_result4) ;
cv: : imshow ( "Result Threshhold truncated to zero inverse " , h_result5) ;
cv: : waitKey ( ) ;
return 0 ;
}
13 opencv cpu 阈值操作性能
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( int argc, char * argv[ ] )
{
cv: : Mat src = cv: : imread ( "images/cameraman.tif" , 0 ) ;
cv: : Mat result_host1, result_host2, result_host3, result_host4, result_host5;
int64 work_begin = cv: : getTickCount ( ) ;
cv: : threshold ( src, result_host1, 128.0 , 255.0 , cv: : THRESH_BINARY) ;
cv: : threshold ( src, result_host2, 128.0 , 255.0 , cv: : THRESH_BINARY_INV) ;
cv: : threshold ( src, result_host3, 128.0 , 255.0 , cv: : THRESH_TRUNC) ;
cv: : threshold ( src, result_host4, 128.0 , 255.0 , cv: : THRESH_TOZERO) ;
cv: : threshold ( src, result_host5, 128.0 , 255.0 , cv: : THRESH_TOZERO_INV) ;
int64 delta = cv: : getTickCount ( ) - work_begin;
double freq = cv: : getTickFrequency ( ) ;
double work_fps = freq / delta;
std: : cout<< "Performance of Thresholding on CPU: " << std: : endl;
std: : cout << "Time: " << ( 1 / work_fps) << std: : endl;
std: : cout << "FPS: " << work_fps << std: : endl;
return 0 ;
}
14) opencv Gpu 阈值操作性能
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( int argc, char * argv[ ] )
{
cv: : Mat h_img1 = cv: : imread ( "images/cameraman.tif" , 0 ) ;
cv: : cuda: : GpuMat d_result1, d_result2, d_result3, d_result4, d_result5, d_img1;
int64 work_begin = cv: : getTickCount ( ) ;
d_img1. upload ( h_img1) ;
cv: : cuda: : threshold ( d_img1, d_result1, 128.0 , 255.0 , cv: : THRESH_BINARY) ;
cv: : cuda: : threshold ( d_img1, d_result2, 128.0 , 255.0 , cv: : THRESH_BINARY_INV) ;
cv: : cuda: : threshold ( d_img1, d_result3, 128.0 , 255.0 , cv: : THRESH_TRUNC) ;
cv: : cuda: : threshold ( d_img1, d_result4, 128.0 , 255.0 , cv: : THRESH_TOZERO) ;
cv: : cuda: : threshold ( d_img1, d_result5, 128.0 , 255.0 , cv: : THRESH_TOZERO_INV) ;
cv: : Mat h_result1, h_result2, h_result3, h_result4, h_result5;
d_result1. download ( h_result1) ;
d_result2. download ( h_result2) ;
d_result3. download ( h_result3) ;
d_result4. download ( h_result4) ;
d_result5. download ( h_result5) ;
int64 delta = cv: : getTickCount ( ) - work_begin;
double freq = cv: : getTickFrequency ( ) ;
double work_fps = freq / delta;
std: : cout << "Performance of Thresholding on GPU: " << std: : endl;
std: : cout << "Time: " << ( 1 / work_fps) << std: : endl;
std: : cout << "FPS: " << work_fps << std: : endl;
return 0 ;
}
opencv GPU接口 直方图均衡化 变形 仿射变换 均值滤波器 高斯核滤波器 索贝尔 拉普拉斯 腐蚀膨胀
1 opencv GPU接口 直方图均衡化
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( )
{
cv: : Mat h_img1 = cv: : imread ( "images/cameraman.tif" , 0 ) ;
cv: : cuda: : GpuMat d_img1, d_result1;
d_img1. upload ( h_img1) ;
cv: : cuda: : equalizeHist ( d_img1, d_result1) ;
cv: : Mat h_result1;
d_result1. download ( h_result1) ;
cv: : imshow ( "Original Image " , h_img1) ;
cv: : imshow ( "Histogram Equalized Image" , h_result1) ;
cv: : imwrite ( "images/result_inversion.png" , h_img1) ;
cv: : imwrite ( "images/result_inversion.png" , h_result1) ;
cv: : waitKey ( ) ;
return 0 ;
}
2 opencv 转成HSV空间 单通道 直方图均衡化 再合并
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( )
{
cv: : Mat h_img1 = cv: : imread ( "images/autumn.tif" ) ;
cv: : Mat h_img2, h_result1;
cvtColor ( h_img1, h_img2, cv: : COLOR_BGR2HSV) ;
std: : vector< cv: : Mat > vec_channels;
cv: : split ( h_img2, vec_channels) ;
cv: : equalizeHist ( vec_channels[ 2 ] , vec_channels[ 2 ] ) ;
cv: : merge ( vec_channels, h_img2) ;
cv: : cvtColor ( h_img2, h_result1, cv: : COLOR_HSV2BGR) ;
cv: : imshow ( "Original Image " , h_img1) ;
cv: : imshow ( "Histogram Equalized Image" , h_result1) ;
cv: : waitKey ( ) ;
return 0 ;
}
3 opencv GPU接口 图像 变形
#include <iostream>
#include "opencv2/opencv.hpp"
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( )
{
cv: : Mat h_img1 = cv: : imread ( "images/cameraman.tif" , 0 ) ;
cv: : cuda: : GpuMat d_img1, d_result1, d_result2;
d_img1. upload ( h_img1) ;
int width= d_img1. cols;
int height = d_img1. size ( ) . height;
cv: : cuda: : resize ( d_img1, d_result1, cv: : Size ( 200 , 200 ) , cv: : INTER_CUBIC) ;
cv: : cuda: : resize ( d_img1, d_result2, cv: : Size ( 0.5 * width, 0.5 * height) , cv: : INTER_LINEAR) ;
cv: : Mat h_result1, h_result2;
d_result1. download ( h_result1) ;
d_result2. download ( h_result2) ;
cv: : imshow ( "Original Image " , h_img1) ;
cv: : imshow ( "Resized Image" , h_result1) ;
cv: : imshow ( "Resized Image 2" , h_result2) ;
cv: : imwrite ( "Resized1.png" , h_result1) ;
cv: : imwrite ( "Resized2.png" , h_result2) ;
cv: : waitKey ( ) ;
return 0 ;
}
4 opencv GPU接口 图像 仿射变换
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( )
{
cv: : Mat h_img1 = cv: : imread ( "images/cameraman.tif" , 0 ) ;
cv: : cuda: : GpuMat d_img1, d_result1, d_result2;
d_img1. upload ( h_img1) ;
int cols= d_img1. cols;
int rows = d_img1. size ( ) . height;
cv: : Mat trans_mat = ( cv: : Mat_< double > ( 2 , 3 ) << 1 , 0 , 70 ,
0 , 1 , 50 ) ;
cv: : cuda: : warpAffine ( d_img1, d_result1, trans_mat, d_img1. size ( ) ) ;
cv: : Point2f pt ( d_img1. cols/ 2. , d_img1. rows/ 2. ) ;
cv: : Mat r = cv: : getRotationMatrix2D ( pt, 45 , 1.0 ) ;
cv: : cuda: : warpAffine ( d_img1, d_result2, r, cv: : Size ( d_img1. cols, d_img1. rows) ) ;
cv: : Mat h_result1, h_result2;
d_result1. download ( h_result1) ;
d_result2. download ( h_result2) ;
cv: : imshow ( "Original Image " , h_img1) ;
cv: : imshow ( "Translated Image" , h_result1) ;
cv: : imshow ( "Rotated Image" , h_result2) ;
cv: : imwrite ( "Translated.png" , h_result1) ;
cv: : imwrite ( "Rotated.png" , h_result2) ;
cv: : waitKey ( ) ;
return 0 ;
}
5 opencv GPU接口 图像 均值滤波器
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( )
{
cv: : Mat h_img1 = cv: : imread ( "images/cameraman.tif" , 0 ) ;
cv: : cuda: : GpuMat d_img1, d_result3x3, d_result5x5, d_result7x7;
d_img1. upload ( h_img1) ;
cv: : Ptr< cv: : cuda: : Filter> filter3x3, filter5x5, filter7x7;
filter3x3 = cv: : cuda: : createBoxFilter ( CV_8UC1, CV_8UC1, cv: : Size ( 3 , 3 ) ) ;
filter3x3-> apply ( d_img1, d_result3x3) ;
filter5x5 = cv: : cuda: : createBoxFilter ( CV_8UC1, CV_8UC1, cv: : Size ( 5 , 5 ) ) ;
filter5x5-> apply ( d_img1, d_result5x5) ;
filter7x7 = cv: : cuda: : createBoxFilter ( CV_8UC1, CV_8UC1, cv: : Size ( 7 , 7 ) ) ;
filter7x7-> apply ( d_img1, d_result7x7) ;
cv: : Mat h_result3x3, h_result5x5, h_result7x7;
d_result3x3. download ( h_result3x3) ;
d_result5x5. download ( h_result5x5) ;
d_result7x7. download ( h_result7x7) ;
cv: : imshow ( "Original Image " , h_img1) ;
cv: : imshow ( "Blurred with kernel size 3x3" , h_result3x3) ;
cv: : imshow ( "Blurred with kernel size 5x5" , h_result5x5) ;
cv: : imshow ( "Blurred with kernel size 7x7" , h_result7x7) ;
cv: : imwrite ( "Blurred3x3.png" , h_result3x3) ;
cv: : imwrite ( "Blurred5x5.png" , h_result5x5) ;
cv: : imwrite ( "Blurred7x7.png" , h_result7x7) ;
cv: : waitKey ( ) ;
return 0 ;
}
6 opencv GPU接口 图像 高斯核 滤波器
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( )
{
cv: : Mat h_img1 = cv: : imread ( "images/cameraman.tif" , 0 ) ;
cv: : cuda: : GpuMat d_img1, d_result3x3, d_result5x5, d_result7x7;
d_img1. upload ( h_img1) ;
cv: : Ptr< cv: : cuda: : Filter> filter3x3, filter5x5, filter7x7;
filter3x3 = cv: : cuda: : createGaussianFilter ( CV_8UC1, CV_8UC1, cv: : Size ( 3 , 3 ) , 1 ) ;
filter3x3-> apply ( d_img1, d_result3x3) ;
filter5x5 = cv: : cuda: : createGaussianFilter ( CV_8UC1, CV_8UC1, cv: : Size ( 5 , 5 ) , 1 ) ;
filter5x5-> apply ( d_img1, d_result5x5) ;
filter7x7 = cv: : cuda: : createGaussianFilter ( CV_8UC1, CV_8UC1, cv: : Size ( 7 , 7 ) , 1 ) ;
filter7x7-> apply ( d_img1, d_result7x7) ;
cv: : Mat h_result3x3, h_result5x5, h_result7x7;
d_result3x3. download ( h_result3x3) ;
d_result5x5. download ( h_result5x5) ;
d_result7x7. download ( h_result7x7) ;
cv: : imshow ( "Original Image " , h_img1) ;
cv: : imshow ( "Blurred with kernel size 3x3" , h_result3x3) ;
cv: : imshow ( "Blurred with kernel size 5x5" , h_result5x5) ;
cv: : imshow ( "Blurred with kernel size 7x7" , h_result7x7) ;
cv: : imwrite ( "gBlurred3x3.png" , h_result3x3) ;
cv: : imwrite ( "gBlurred5x5.png" , h_result5x5) ;
cv: : imwrite ( "gBlurred7x7.png" , h_result7x7) ;
cv: : waitKey ( ) ;
return 0 ;
}
7 cpu 均值滤波器
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( )
{
cv: : Mat h_img1 = cv: : imread ( "images/saltpepper.png" , 0 ) ;
cv: : Mat h_result;
cv: : medianBlur ( h_img1, h_result, 3 ) ;
cv: : imshow ( "Original Image " , h_img1) ;
cv: : imshow ( "Median Blur Result" , h_result) ;
cv: : waitKey ( ) ;
return 0 ;
}
8 GPU 索贝尔滤波器
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( )
{
cv: : Mat h_img1 = cv: : imread ( "images/blobs.png" , 0 ) ;
cv: : cuda: : GpuMat d_img1, d_resultx, d_resulty, d_resultxy;
d_img1. upload ( h_img1) ;
cv: : Ptr< cv: : cuda: : Filter> filterx, filtery, filterxy;
filterx = cv: : cuda: : createSobelFilter ( CV_8UC1, CV_8UC1, 1 , 0 ) ;
filterx-> apply ( d_img1, d_resultx) ;
filtery = cv: : cuda: : createSobelFilter ( CV_8UC1, CV_8UC1, 0 , 1 ) ;
filtery-> apply ( d_img1, d_resulty) ;
cv: : cuda: : add ( d_resultx, d_resulty, d_resultxy) ;
cv: : Mat h_resultx, h_resulty, h_resultxy;
d_resultx. download ( h_resultx) ;
d_resulty. download ( h_resulty) ;
d_resultxy. download ( h_resultxy) ;
cv: : imshow ( "Original Image " , h_img1) ;
cv: : imshow ( "Sobel-x derivative" , h_resultx) ;
cv: : imshow ( "Sobel-y derivative" , h_resulty) ;
cv: : imshow ( "Sobel-xy derivative" , h_resultxy) ;
cv: : imwrite ( "sobelx.png" , h_resultx) ;
cv: : imwrite ( "sobely.png" , h_resulty) ;
cv: : imwrite ( "sobelxy.png" , h_resultxy) ;
cv: : waitKey ( ) ;
return 0 ;
}
9 GPU ScharrFilter 滤波器 类似 索贝尔 Sobel
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( )
{
cv: : Mat h_img1 = cv: : imread ( "images/blobs.png" , 0 ) ;
cv: : cuda: : GpuMat d_img1, d_resultx, d_resulty, d_resultxy;
d_img1. upload ( h_img1) ;
cv: : Ptr< cv: : cuda: : Filter> filterx, filtery;
filterx = cv: : cuda: : createScharrFilter ( CV_8UC1, CV_8UC1, 1 , 0 ) ;
filterx-> apply ( d_img1, d_resultx) ;
filtery = cv: : cuda: : createScharrFilter ( CV_8UC1, CV_8UC1, 0 , 1 ) ;
filtery-> apply ( d_img1, d_resulty) ;
cv: : cuda: : add ( d_resultx, d_resulty, d_resultxy) ;
cv: : Mat h_resultx, h_resulty, h_resultxy;
d_resultx. download ( h_resultx) ;
d_resulty. download ( h_resulty) ;
d_resultxy. download ( h_resultxy) ;
cv: : imshow ( "Original Image " , h_img1) ;
cv: : imshow ( "Scharr-x derivative" , h_resultx) ;
cv: : imshow ( "Scharr-y derivative" , h_resulty) ;
cv: : imshow ( "Scharr-xy derivative" , h_resultxy) ;
cv: : imwrite ( "scharrx.png" , h_resultx) ;
cv: : imwrite ( "scharry.png" , h_resulty) ;
cv: : imwrite ( "scharrxy.png" , h_resultxy) ;
cv: : waitKey ( ) ;
return 0 ;
}
9 GPU 拉普拉斯滤波器
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( )
{
cv: : Mat h_img1 = cv: : imread ( "images/blobs.png" , 0 ) ;
cv: : cuda: : GpuMat d_img1, d_result1, d_result3;
d_img1. upload ( h_img1) ;
cv: : Ptr< cv: : cuda: : Filter> filter1, filter3;
filter1 = cv: : cuda: : createLaplacianFilter ( CV_8UC1, CV_8UC1, 1 ) ;
filter1-> apply ( d_img1, d_result1) ;
filter3 = cv: : cuda: : createLaplacianFilter ( CV_8UC1, CV_8UC1, 3 ) ;
filter3-> apply ( d_img1, d_result3) ;
cv: : Mat h_result1, h_result3;
d_result1. download ( h_result1) ;
d_result3. download ( h_result3) ;
cv: : imshow ( "Original Image " , h_img1) ;
cv: : imshow ( "Laplacian Filter 1" , h_result1) ;
cv: : imshow ( "Laplacian Filter 3" , h_result3) ;
cv: : imwrite ( "laplacian1.png" , h_result1) ;
cv: : imwrite ( "laplacian3.png" , h_result3) ;
cv: : waitKey ( ) ;
return 0 ;
}
9 GPU 腐蚀膨胀操作
#include <iostream>
#include "opencv2/opencv.hpp"
int main ( )
{
cv: : Mat h_img1 = cv: : imread ( "images/blobs.png" , 0 ) ;
cv: : cuda: : GpuMat d_img1, d_resulte, d_resultd, d_resulto, d_resultc;
cv: : Mat element = cv: : getStructuringElement ( cv: : MORPH_RECT, cv: : Size ( 5 , 5 ) ) ;
d_img1. upload ( h_img1) ;
cv: : Ptr< cv: : cuda: : Filter> filtere, filterd, filtero, filterc;
filtere = cv: : cuda: : createMorphologyFilter ( cv: : MORPH_ERODE, CV_8UC1, element) ;
filtere-> apply ( d_img1, d_resulte) ;
filterd = cv: : cuda: : createMorphologyFilter ( cv: : MORPH_DILATE, CV_8UC1, element) ;
filterd-> apply ( d_img1, d_resultd) ;
filtero = cv: : cuda: : createMorphologyFilter ( cv: : MORPH_OPEN, CV_8UC1, element) ;
filtero-> apply ( d_img1, d_resulto) ;
filterc = cv: : cuda: : createMorphologyFilter ( cv: : MORPH_CLOSE, CV_8UC1, element) ;
filterc-> apply ( d_img1, d_resultc) ;
cv: : Mat h_resulte, h_resultd, h_resulto, h_resultc;
d_resulte. download ( h_resulte) ;
d_resultd. download ( h_resultd) ;
d_resulto. download ( h_resulto) ;
d_resultc. download ( h_resultc) ;
cv: : imshow ( "Original Image " , h_img1) ;
cv: : imshow ( "Erosion" , h_resulte) ;
cv: : imshow ( "Dilation" , h_resultd) ;
cv: : imshow ( "Opening" , h_resulto) ;
cv: : imshow ( "closing" , h_resultc) ;
cv: : imwrite ( "erosion7.png" , h_resulte) ;
cv: : imwrite ( "dilation7.png" , h_resultd) ;
cv: : imwrite ( "opening7.png" , h_resulto) ;
cv: : imwrite ( "closing7.png" , h_resultc) ;
cv: : waitKey ( ) ;
return 0 ;
}
opencv GPU接口 边缘检测 orb sift 特征 candy hough mog 级联回归人脸检测
1 蓝色通道图像 边缘检测
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int main ( int argc, char * * argv )
{
VideoCapture cap ( 0 ) ;
if ( ! cap. isOpened ( ) )
{
cout << "Cannot open the web cam" << endl;
return - 1 ;
}
while ( true)
{
Mat frame;
bool flag = cap. read ( frame) ;
if ( ! flag)
{
cout << "Cannot read a frame from webcam" << endl;
break ;
}
cuda: : GpuMat d_frame, d_frame_hsv, d_intermediate, d_result;
cuda: : GpuMat d_frame_shsv[ 3 ] ;
cuda: : GpuMat d_thresc[ 3 ] ;
Mat h_result;
d_frame. upload ( frame) ;
cuda: : cvtColor ( d_frame, d_frame_hsv, COLOR_BGR2HSV) ;
cuda: : split ( d_frame_hsv, d_frame_shsv) ;
cuda: : threshold ( d_frame_shsv[ 0 ] , d_thresc[ 0 ] , 110 , 130 , THRESH_BINARY) ;
cuda: : threshold ( d_frame_shsv[ 1 ] , d_thresc[ 1 ] , 50 , 255 , THRESH_BINARY) ;
cuda: : threshold ( d_frame_shsv[ 2 ] , d_thresc[ 2 ] , 50 , 255 , THRESH_BINARY) ;
cv: : cuda: : bitwise_and ( d_thresc[ 0 ] , d_thresc[ 1 ] , d_intermediate) ;
cv: : cuda: : bitwise_and ( d_intermediate, d_thresc[ 2 ] , d_result) ;
d_result. download ( h_result) ;
imshow ( "Thresholded Image" , h_result) ;
imshow ( "Original" , frame) ;
if ( waitKey ( 1 ) == 'q' )
{
break ;
}
}
return 0 ;
}
2 GPU canny边缘检测
#include <cmath>
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
using namespace cv: : cuda;
int main ( )
{
Mat h_image = imread ( "images/drawing.JPG" , 0 ) ;
if ( h_image. empty ( ) )
{
cout << "can not open image" << endl;
return - 1 ;
}
GpuMat d_edge, d_image;
Mat h_edge;
d_image. upload ( h_image) ;
cv: : Ptr< cv: : cuda: : CannyEdgeDetector> canny_edge = cv: : cuda: : createCannyEdgeDetector ( 2.0 , 100.0 , 3 , false) ;
canny_edge-> detect ( d_image, d_edge) ;
d_edge. download ( h_edge) ;
imshow ( "source" , h_image) ;
imshow ( "detected edges" , h_edge) ;
waitKey ( 0 ) ;
return 0 ;
}
3 霍夫线变换 cpu 与 gpu 函数 运行时间对比
#include <cmath>
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
using namespace cv: : cuda;
int main ( )
{
Mat h_image = imread ( "images/drawing.JPG" , 0 ) ;
if ( h_image. empty ( ) )
{
cout << "can not open image" << endl;
return - 1 ;
}
Mat h_edge;
cv: : Canny ( h_image, h_edge, 100 , 200 , 3 ) ;
Mat h_imagec;
cv: : cvtColor ( h_edge, h_imagec, COLOR_GRAY2BGR) ;
Mat h_imageg = h_imagec. clone ( ) ;
vector< Vec4i> h_lines;
{
const int64 start = getTickCount ( ) ;
HoughLinesP ( h_edge, h_lines, 1 , CV_PI / 180 , 50 , 60 , 5 ) ;
const double time_elapsed = ( getTickCount ( ) - start) / getTickFrequency ( ) ;
cout << "CPU Time : " << time_elapsed * 1000 << " ms" << endl;
cout << "CPU FPS : " << ( 1 / time_elapsed) << endl;
}
for ( size_t i = 0 ; i < h_lines. size ( ) ; ++ i)
{
Vec4i line_point = h_lines[ i] ;
line ( h_imagec, Point ( line_point[ 0 ] , line_point[ 1 ] ) , Point ( line_point[ 2 ] , line_point[ 3 ] ) , Scalar ( 0 , 0 , 255 ) , 2 , LINE_AA) ;
}
GpuMat d_edge, d_lines;
d_edge. upload ( h_edge) ;
{
const int64 start = getTickCount ( ) ;
Ptr< cuda: : HoughSegmentDetector> hough = cuda: : createHoughSegmentDetector ( 1.0f , ( float ) ( CV_PI / 180.0f ) , 50 , 5 ) ;
hough-> detect ( d_edge, d_lines) ;
const double time_elapsed = ( getTickCount ( ) - start) / getTickFrequency ( ) ;
cout << "GPU Time : " << time_elapsed * 1000 << " ms" << endl;
cout << "GPU FPS : " << ( 1 / time_elapsed) << endl;
}
vector< Vec4i> lines_g;
if ( ! d_lines. empty ( ) )
{
lines_g. resize ( d_lines. cols) ;
Mat h_lines ( 1 , d_lines. cols, CV_32SC4, & lines_g[ 0 ] ) ;
d_lines. download ( h_lines) ;
}
for ( size_t i = 0 ; i < lines_g. size ( ) ; ++ i)
{
Vec4i line_point = lines_g[ i] ;
line ( h_imageg, Point ( line_point[ 0 ] , line_point[ 1 ] ) , Point ( line_point[ 2 ] , line_point[ 3 ] ) , Scalar ( 0 , 0 , 255 ) , 2 , LINE_AA) ;
}
imshow ( "source" , h_image) ;
imshow ( "detected lines [CPU]" , h_imagec) ;
imshow ( "detected lines [GPU]" , h_imageg) ;
imwrite ( "hough_source.png" , h_image) ;
imwrite ( "hough_cpu_line.png" , h_imagec) ;
imwrite ( "hough_gpu_line.png" , h_imageg) ;
waitKey ( 0 ) ;
return 0 ;
}
4 OPENCV GPU faster特征点检测
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int main ( )
{
Mat h_image = imread ( "images/drawing.JPG" , 0 ) ;
cv: : Ptr< cv: : cuda: : FastFeatureDetector> detector = cv: : cuda: : FastFeatureDetector: : create ( 100 , true, 2 ) ;
std: : vector< cv: : KeyPoint> keypoints;
cv: : cuda: : GpuMat d_image;
d_image. upload ( h_image) ;
detector-> detect ( d_image, keypoints) ;
cv: : drawKeypoints ( h_image, keypoints, h_image) ;
imshow ( "Final Result" , h_image ) ;
waitKey ( 0 ) ;
return 0 ;
}
5 OPENCV GPU orb特征点检测
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int main ( )
{
Mat h_image = imread ( "images/drawing.JPG" , 0 ) ;
cv: : Ptr< cv: : cuda: : ORB> detector = cv: : cuda: : ORB: : create ( ) ;
std: : vector< cv: : KeyPoint> keypoints;
cv: : cuda: : GpuMat d_image;
d_image. upload ( h_image) ;
detector-> detect ( d_image, keypoints) ;
cv: : drawKeypoints ( h_image, keypoints, h_image) ;
imshow ( "Final Result" , h_image ) ;
waitKey ( 0 ) ;
return 0 ;
}
6 OPENCV GPU SURF特征 检测 描述子匹配 单应变换目标图像位置显示
#include <stdio.h>
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/calib3d.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/features2d.hpp"
#include "opencv2/xfeatures2d.hpp"
#include "opencv2/xfeatures2d/nonfree.hpp"
#include "opencv2/core/cuda.hpp"
#include "opencv2/cudaarithm.hpp"
#include "opencv2/cudafeatures2d.hpp"
#include "opencv2/xfeatures2d/cuda.hpp"
using namespace cv;
using namespace cv: : xfeatures2d;
using namespace std;
int main ( int argc, char * * argv )
{
Mat h_object_image = imread ( "images/object1.jpg" , 0 ) ;
Mat h_scene_image = imread ( "images/scene1.jpg" , 0 ) ;
cuda: : GpuMat d_object_image;
cuda: : GpuMat d_scene_image;
cuda: : GpuMat d_keypoints_scene, d_keypoints_object;
vector< KeyPoint > h_keypoints_scene, h_keypoints_object;
cuda: : GpuMat d_descriptors_scene, d_descriptors_object;
d_object_image. upload ( h_object_image) ;
d_scene_image. upload ( h_scene_image) ;
cuda: : SURF_CUDA surf ( 100 ) ;
surf ( d_object_image, cuda: : GpuMat ( ) , d_keypoints_object, d_descriptors_object ) ;
surf ( d_scene_image, cuda: : GpuMat ( ) , d_keypoints_scene, d_descriptors_scene ) ;
Ptr< cuda: : DescriptorMatcher > matcher = cuda: : DescriptorMatcher: : createBFMatcher ( ) ;
vector< vector< DMatch> > d_matches;
matcher-> knnMatch ( d_descriptors_object, d_descriptors_scene, d_matches, 2 ) ;
surf. downloadKeypoints ( d_keypoints_scene, h_keypoints_scene) ;
surf. downloadKeypoints ( d_keypoints_object, h_keypoints_object) ;
std: : vector< DMatch > good_matches;
for ( int k = 0 ; k < std: : min ( h_keypoints_object. size ( ) - 1 , d_matches. size ( ) ) ; k++ )
{
if ( ( d_matches[ k] [ 0 ] . distance < 0.6 * ( d_matches[ k] [ 1 ] . distance) ) &&
( ( int ) d_matches[ k] . size ( ) <= 2 && ( int ) d_matches[ k] . size ( ) > 0 ) )
{
good_matches. push_back ( d_matches[ k] [ 0 ] ) ;
}
}
std: : cout << "size:" << good_matches. size ( ) ;
Mat h_image_result;
drawMatches ( h_object_image, h_keypoints_object, h_scene_image, h_keypoints_scene,
good_matches, h_image_result, Scalar: : all ( - 1 ) , Scalar: : all ( - 1 ) ,
vector< char > ( ) , DrawMatchesFlags: : DEFAULT ) ;
std: : vector< Point2f> object;
std: : vector< Point2f> scene;
for ( int i = 0 ; i < good_matches. size ( ) ; i++ )
{
object. push_back ( h_keypoints_object[ good_matches[ i] . queryIdx] . pt) ;
scene. push_back ( h_keypoints_scene[ good_matches[ i] . trainIdx] . pt) ;
}
Mat Homo = findHomography ( object, scene, RANSAC) ;
std: : vector< Point2f> corners ( 4 ) ;
std: : vector< Point2f> scene_corners ( 4 ) ;
corners[ 0 ] = Point ( 0 , 0 ) ;
corners[ 1 ] = Point ( h_object_image. cols, 0 ) ;
corners[ 2 ] = Point ( h_object_image. cols, h_object_image. rows) ;
corners[ 3 ] = Point ( 0 , h_object_image. rows) ;
perspectiveTransform ( corners, scene_corners, Homo) ;
line ( h_image_result, scene_corners[ 0 ] + Point2f ( h_object_image. cols, 0 ) , scene_corners[ 1 ] + Point2f ( h_object_image. cols, 0 ) , Scalar ( 255 , 0 , 0 ) , 4 ) ;
line ( h_image_result, scene_corners[ 1 ] + Point2f ( h_object_image. cols, 0 ) , scene_corners[ 2 ] + Point2f ( h_object_image. cols, 0 ) , Scalar ( 255 , 0 , 0 ) , 4 ) ;
line ( h_image_result, scene_corners[ 2 ] + Point2f ( h_object_image. cols, 0 ) , scene_corners[ 3 ] + Point2f ( h_object_image. cols, 0 ) , Scalar ( 255 , 0 , 0 ) , 4 ) ;
line ( h_image_result, scene_corners[ 3 ] + Point2f ( h_object_image. cols, 0 ) , scene_corners[ 0 ] + Point2f ( h_object_image. cols, 0 ) , Scalar ( 255 , 0 , 0 ) , 4 ) ;
imshow ( "Good Matches & Object detection" , h_image_result) ;
waitKey ( 0 ) ;
return 0 ;
}
7 OPENCV gpu 级联回归 人脸检测
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/cudaobjdetect.hpp"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
int main ( )
{
Mat h_image;
h_image = imread ( "images/lena_color_512.tif" , 0 ) ;
Ptr< cuda: : CascadeClassifier> cascade = cuda: : CascadeClassifier: : create ( "haarcascade_frontalface_alt2.xml" ) ;
cuda: : GpuMat d_image;
cuda: : GpuMat d_buf;
d_image. upload ( h_image) ;
cascade-> detectMultiScale ( d_image, d_buf) ;
std: : vector< Rect> detections;
cascade-> convert ( d_buf, detections) ;
if ( detections. empty ( ) )
std: : cout << "No detection." << std: : endl;
cvtColor ( h_image, h_image, COLOR_GRAY2BGR) ;
for ( int i = 0 ; i < detections. size ( ) ; ++ i)
{
rectangle ( h_image, detections[ i] , Scalar ( 0 , 255 , 255 ) , 5 ) ;
}
imshow ( "Result image" , h_image) ;
waitKey ( 0 ) ;
return 0 ;
}
8 OPENCV gpu 级联回归 人脸检测 处理视频
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main ( )
{
VideoCapture cap ( 0 ) ;
if ( ! cap. isOpened ( ) )
{
cerr << "Can not open video source" ;
return - 1 ;
}
std: : vector< cv: : Rect> h_found;
cv: : Ptr< cv: : cuda: : CascadeClassifier> cascade =
cv: : cuda: : CascadeClassifier: : create ( "haarcascade_frontalface_alt2.xml" ) ;
cv: : cuda: : GpuMat d_frame, d_gray, d_found;
while ( 1 )
{
Mat frame;
if ( ! cap. read ( frame) )
{
cerr << "Can not read frame from webcam" ;
return - 1 ;
}
d_frame. upload ( frame) ;
cv: : cuda: : cvtColor ( d_frame, d_gray, cv: : COLOR_BGR2GRAY) ;
cascade-> detectMultiScale ( d_gray, d_found) ;
cascade-> convert ( d_found, h_found) ;
for ( int i = 0 ; i < h_found. size ( ) ; ++ i)
{
rectangle ( frame, h_found[ i] , Scalar ( 0 , 255 , 255 ) , 5 ) ;
}
imshow ( "Result" , frame) ;
if ( waitKey ( 1 ) == 'q' ) {
break ;
}
}
return 0 ;
}
9 OPENCV gpu 级联回归 人眼检测
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/cudaobjdetect.hpp"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
int main ( )
{
Mat h_image;
h_image = imread ( "images/lena_color_512.tif" , 0 ) ;
Ptr< cuda: : CascadeClassifier> cascade = cuda: : CascadeClassifier: : create ( "haarcascade_eye.xml" ) ;
cuda: : GpuMat d_image;
cuda: : GpuMat d_buf;
d_image. upload ( h_image) ;
cascade-> detectMultiScale ( d_image, d_buf) ;
std: : vector< Rect> detections;
cascade-> convert ( d_buf, detections) ;
if ( detections. empty ( ) )
std: : cout << "No detection." << std: : endl;
cvtColor ( h_image, h_image, COLOR_GRAY2BGR) ;
for ( int i = 0 ; i < detections. size ( ) ; ++ i)
{
rectangle ( h_image, detections[ i] , Scalar ( 0 , 255 , 255 ) , 5 ) ;
}
imshow ( "Result image" , h_image) ;
waitKey ( 0 ) ;
return 0 ;
}
10 gpu 背景减除进行目标检测 背景/前景 检测
#include <iostream>
#include <string>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
using namespace cv: : cuda;
int main ( )
{
VideoCapture cap ( "abc.avi" ) ;
if ( ! cap. isOpened ( ) )
{
cerr << "can not open camera or video file" << endl;
return - 1 ;
}
Mat frame;
cap. read ( frame) ;
GpuMat d_frame;
d_frame. upload ( frame) ;
Ptr< BackgroundSubtractor> mog = cuda: : createBackgroundSubtractorMOG ( ) ;
GpuMat d_fgmask, d_fgimage, d_bgimage;
Mat h_fgmask, h_fgimage, h_bgimage;
mog-> apply ( d_frame, d_fgmask, 0.01 ) ;
while ( 1 )
{
cap. read ( frame) ;
if ( frame. empty ( ) )
break ;
d_frame. upload ( frame) ;
int64 start = cv: : getTickCount ( ) ;
mog-> apply ( d_frame, d_fgmask, 0.01 ) ;
mog-> getBackgroundImage ( d_bgimage) ;
double fps = cv: : getTickFrequency ( ) / ( cv: : getTickCount ( ) - start) ;
std: : cout << "FPS : " << fps << std: : endl;
d_fgimage. create ( d_frame. size ( ) , d_frame. type ( ) ) ;
d_fgimage. setTo ( Scalar: : all ( 0 ) ) ;
d_frame. copyTo ( d_fgimage, d_fgmask) ;
d_fgmask. download ( h_fgmask) ;
d_fgimage. download ( h_fgimage) ;
d_bgimage. download ( h_bgimage) ;
imshow ( "image" , frame) ;
imshow ( "foreground mask" , h_fgmask) ;
imshow ( "foreground image" , h_fgimage) ;
imshow ( "mean background image" , h_bgimage) ;
if ( waitKey ( 1 ) == 'q' )
break ;
}
return 0 ;
}
11 GMG 统计背景图像估计和每像素贝叶斯分割
#include <iostream>
#include <string>
#include "opencv2/opencv.hpp"
#include "opencv2/core.hpp"
#include "opencv2/core/utility.hpp"
#include "opencv2/cudabgsegm.hpp"
#include "opencv2/cudalegacy.hpp"
#include "opencv2/video.hpp"
#include "opencv2/highgui.hpp"
using namespace std;
using namespace cv;
using namespace cv: : cuda;
int main (
)
{
VideoCapture cap ( "abc.avi" ) ;
if ( ! cap. isOpened ( ) )
{
cerr << "can not open video file" << endl;
return - 1 ;
}
Mat frame;
cap. read ( frame) ;
GpuMat d_frame;
d_frame. upload ( frame) ;
Ptr< BackgroundSubtractor> gmg = cuda: : createBackgroundSubtractorGMG ( 40 ) ;
GpuMat d_fgmask, d_fgimage, d_bgimage;
Mat h_fgmask, h_fgimage, h_bgimage;
gmg-> apply ( d_frame, d_fgmask) ;
while ( 1 )
{
cap. read ( frame) ;
if ( frame. empty ( ) )
break ;
d_frame. upload ( frame) ;
int64 start = cv: : getTickCount ( ) ;
gmg-> apply ( d_frame, d_fgmask, 0.01 ) ;
double fps = cv: : getTickFrequency ( ) / ( cv: : getTickCount ( ) - start) ;
std: : cout << "FPS : " << fps << std: : endl;
d_fgimage. create ( d_frame. size ( ) , d_frame. type ( ) ) ;
d_fgimage. setTo ( Scalar: : all ( 0 ) ) ;
d_frame. copyTo ( d_fgimage, d_fgmask) ;
d_fgmask. download ( h_fgmask) ;
d_fgimage. download ( h_fgimage) ;
imshow ( "image" , frame) ;
imshow ( "foreground mask" , h_fgmask) ;
imshow ( "foreground image" , h_fgimage) ;
if ( waitKey ( 30 ) == 'q' )
break ;
}
return 0 ;
}
f
pycuda