[14] CUDA_使用Opencv处理图像

CUDA_使用Opencv处理图像

1. Opencv中的图像表示

  • Opencv 提供了Mat 类来存储图像,如下:
cv::Mat img;
img=cv::imread("cameraman.tif);
  • 定义图像的示例:
//定义单通道图像
cv::Mat img(6,6,CV_8UC1);
//32位浮点型
Mat img2(256,256,CV_32FC1);
Mat img3(1960,1024,CV_64FC3);
  • 图像的分辨率和大小决定该图像保存到磁盘上的空间,假设有3个通道、大小为1024X1024的彩色图像,则需要 3X1024X1024 bytes = 3MB 空间来存放这个图像。

2. 图像的读取和显示

  • 图像读取与显示实现如下:
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
 // Read the image 
 Mat img = imread("images/cameraman.tif",0);

 // Check for failure in reading an Image
 if (img.empty()) 
 {
  cout << "Could not open an image" << endl;
  return -1;
 }
//Name of the window
 String win_name = "My First Opencv Program"; 

 // Create a window
 namedWindow(win_name); 

 // Show our image inside the created window.
imshow(win_name, img); 

// Wait for any keystroke in the window 
waitKey(0); 

//destroy the created window
 destroyWindow(win_name); 

 return 0;
}

3. 使用Opencv 创建图像

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	//Create blanck black color Image with seze 256x256
	Mat img1(256, 256, CV_8UC1, Scalar(0));
	String win_name1 = "Blank Image";
	namedWindow(win_name1,0);
	imshow(win_name1, img1);


	//Create blank blue color Image with size 256x256
	Mat img(256, 256, CV_8UC3, Scalar(255, 0, 0));
	String win_name = "Blank Blue Color Image";
	namedWindow(win_name,0);
	imshow(win_name, img);

	waitKey(0);
	destroyWindow(win_name1);
	destroyWindow(win_name);

	return 0;
}

在这里插入图片描述

  • 在空白图像上绘制形状:
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    //create a new image which consists of 
    //3 channels 
    //image depth of 8 bits 
    //800 x 600 of resolution (800 wide and 600 high)
    //each pixels initialized to the value of (100, 250, 30) for Blue, Green and Red planes respectively.
    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"; //Name of the window

    namedWindow(win_name); // Create a window
    imshow(win_name, img); // Show our image inside the created window.
    waitKey(0); // Wait for any keystroke in the window
    destroyWindow(win_name); //destroy the created window

    return 0;
}

在这里插入图片描述

  • 保存图像
bool flag=cv::imwrite("images/save_image.jpg",img);

4. 使用Opencv 处理视频

  • 处理本地视频:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{
    //open the video file from PC
    VideoCapture cap("images/rhinos.avi");
    // if not success, exit program
    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;
        // read a frame
        bool flag = cap.read(frame);

        //Breaking the while loop at the end of the video
        if (flag == false)
        {
            break;
        }
        //display the frame 
        imshow(win_name, frame);
        //Wait for 100 ms and key 'q' for exit
        if (waitKey(100) == 'q')
        {
            break;
        }
    }
    destroyWindow(win_name);
    return 0;
}
  • 处理网络相机:
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
 //open the Webcam
 VideoCapture cap(0); 
 // if not success, exit program
 if (cap.isOpened() == false)  
 {
  cout << "Cannot open Webcam" << endl;
  return -1;
 }
 //get the frames rate of the video
 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); //create a window
 while (true)
 {
  Mat frame;
  bool flag = cap.read(frame); // read a new frame from video 
  //show the frame in the created window
  imshow(win_name, frame);
  if (waitKey(1) == 'q')
  {
      break;
  }
 }
return 0;
}
  • 保存视频:
size frame_size(640,640);
int frame_per_second = 30;
Videowriter v_writer("image/video.avi",Videowriter::fourcc('M','J','P','G'),frames_per_second,frame_size,true)
v_writer.write(frame);
v_writer.release();
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 如何提高 OpenCV 处理图像的速度: 1. 使用加速器:OpenCV 支持使用多种加速器,例如 CUDA 和 OpenCL。 2. 使用预先处理:在实际处理前预先处理图像,例如缩小图像大小或转换为灰度图像。 3. 优化代码:避免冗余代码,并尝试使用高效的 OpenCV 函数。 4. 并行处理使用多核处理器或分布式系统进行并行处理。 5. 预先训练:对于机器学习模型,预先训练模型并保存模型参数,以减少每次处理图像所需的时间。 ### 回答2: 要提高OpenCV处理图像的速度,可以采取以下几种方法: 1. 使用较小的图像尺寸:如果图像的分辨率太高,可能会导致处理速度变慢。可以考虑将图像缩小到适当的尺寸,以减少计算量。 2. 使用多线程并行处理OpenCV支持多线程处理,可以将图像分割成多个区域,分别在不同的线程中处理,以加快处理速度。 3. 使用适当的算法和函数:在进行图像处理时,选择适合的算法和函数,能够更高效地完成特定任务。了解OpenCV的函数参数和算法的特点,可以帮助我们选择合适的方法。 4. 优化代码实现:对于重复执行的代码,可以考虑进行代码优化,避免重复计算和内存操作,以提高运行效率。 5. 使用硬件加速:利用图像处理的硬件加速功能,如GPU,可以提供更高的处理速度。OpenCV也提供了与硬件加速相关的函数和算法。 6. 选择合适的数据类型:在OpenCV中,针对不同的图像类型有不同的数据类型。选择合适的数据类型,可以减少内存占用和计算量。 7. 使用OpenCV中的优化功能:OpenCV提供了一些优化的功能和库,如T-API、UMat等,可以提供更高的处理效率。 综上所述,通过调整图像尺寸、使用多线程、选择合适的算法和函数、优化代码实现、利用硬件加速、选择合适的数据类型以及使用OpenCV中的优化功能,可以有效地提高OpenCV处理图像的速度。 ### 回答3: 要提高OpenCV处理图像的速度,可以尝试以下几种方法: 1. 选择适当的图像处理算法:OpenCV提供了许多图像处理算法,每种算法都有不同的速度和效果。根据具体需求选择合适的算法,有时候简单的算法比复杂的算法更快。 2. 优化图像读取和保存速度:在读取和保存图像时,可以选择适当的图像格式(如JPEG)以减小文件大小,从而提高读取和保存的速度。 3. 并行处理OpenCV提供了一些并行处理的函数(如并行循环),可以利用多核处理器实现并行计算,从而提高处理速度。 4. 减小图像尺寸:如果处理图像过大,可以考虑减小图像尺寸,这样可以减少计算量,从而提高处理速度。可以使用OpenCV提供的函数来调整图像大小。 5. GPU加速:如果有GPU可用,可以使用OpenCV提供的GPU加速功能来处理图像,因为GPU在并行计算方面有很大的优势,可以显著提升处理速度。 6. 优化算法参数:某些算法拥有一些可调参数,通过调整这些参数,可以提高算法的速度和效果。 总之,要提高OpenCV处理图像的速度,需要选择适当的算法、优化图像读取和保存、并行处理、减小图像尺寸、使用GPU加速以及优化算法参数等方法来提高处理速度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月醉窗台

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值