opencv 以及 c++ 函數


1. 點旋轉

    vector<Point> rot_pt(vector<Point> &v_pt,const cv::Mat &map_matrix)
    {
        //std::cout<<"map_matrix="<<map_matrix<<std::endl;
        float *map = (float *)map_matrix.ptr<float>();

        vector<Point> v_pt2src;
        for(int i=0;i<v_pt.size();i++)
        {
            //std::cout<<"src_pt="<<v_pt[i]<<std::endl;
            int x_t = v_pt[i].x;
            int y_t = v_pt[i].y;
            int x =  map[0]* x_t + map[1] * y_t + map[2];
            int y = map[3] * x_t + map[4] * y_t + map[5];
            v_pt2src.push_back(Point(x,y));
        }
        return v_pt2src;
    }

2.用c++11計算耗時

#include <chrono>
#include <iostream>

int main()
{
    auto t0 = std::chrono::steady_clock::now();

    // Task to do

      std::cout << "consume time="<<std::chrono::duration_cast<std::chrono::milliseconds>
                        (std::chrono::steady_clock::now() - t0).count()<<"ms"<<std::endl;
    return 0;
}

上面是毫秒,也有秒,納秒

std::chrono::duration_cast<std::chrono::nanoseconds>  //納秒
std::chrono::duration_cast<std::chrono::microseconds> //微秒
std::chrono::duration_cast<std::chrono::milliseconds> //毫秒
std::chrono::duration_cast<std::chrono::seconds>      //秒

3. c++ opencv直接減均值 除方差

bool sub_mean( cv::Mat &img,cv::Mat &m_out)
{
    img.convertTo(img, CV_32FC3);//這里注意一定要是CV_32FC3,要不然默認是uint,【0-255】,負數直接變為0
    const vector<float> m_v_mean = {104.0,117.0,123.0};
    if(3 != img.channels() || 3 != m_v_mean.size() || img.empty())
    {
        return false;
    }
    cv::Mat m_arr[3];
    cv::split(img,m_arr);
    for(int i=0;i<m_v_mean.size();i++)
    {
        m_arr[i] = m_arr[i] - m_v_mean[i];
    }
    merge(m_arr,3,m_out);
    return true;
}

其實opencv可以一句話搞定!!!!

img.convertTo(img, CV_32FC3);
Mat m_out_2 = img - cv::Scalar(104.0,117.0,123.0);

opencv不支持直接除(除方差) Mat m_out_2 = img / cv::Scalar(104.0,117.0,123.0);
下面代碼是opencv 減均值除方差操作

    Mat img = imread("/data_4/everyday/0902/snake/88.png",IMREAD_UNCHANGED);
    Mat img2;
    img.convertTo(img2, CV_32F);
    img2 = img2 / 255.0;
    Mat m_out_2 = img2 - cv::Scalar(0.40789655,0.44719303,0.47026116);
    vector<float> v_std_ = {0.2886383,0.27408165,0.27809834};

    std::vector<cv::Mat> bgrChannels(3);
    cv::split(m_out_2, bgrChannels);
    for(int i=0;i<3;i++)
    {
        bgrChannels[i].convertTo(bgrChannels[i], CV_32FC1, 1.0 / v_std_[i]);
    }
    Mat m_out_3;
    cv::merge(bgrChannels, m_out_3);

4. 去除顏色信息 彩色圖轉灰度圖,灰度圖轉彩色圖

c++版本

 cv::Mat img = cv::imread(img_path);//三通道
 cvtColor(img, img, CV_BGR2GRAY);//單通道
 cvtColor(img, img, CV_GRAY2BGR);//三通道

python 版本

        img = cv2.imread(image_path, cv2.IMREAD_COLOR).astype('float32')
        img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        img=cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

5. opencv imread函數的第二個參數

Mat imread(const string& filename, int flags = 1);
第一個參數filename是我們需要載入圖片的路徑名。至於第二個參數,表示的是加載的圖像是什么類型,可以看到它自帶的默認值為1。至於具體有多少種取值,各個取值代表什么類型,我網上找了好多資料都不盡相同。經過我在vs下親自驗證,總結一下幾種參數值:
CV_LOAD_IMAGE_UNCHANGED = -1(含<-1的整數)—— 在每個通道中,每個像素的位深為8 bit,通道數(顏色)保持不變;
CV_LOAD_IMAGE_GRAYSCALE = 0 ——位深為8bit,通道數 = 1(灰度圖);
CV_LOAD_IMAGE_COLOR = 1(含其余>1整數)——位深 = ?(不確定),通道數 = 3(BGR圖);
CV_LOAD_IMAGE_ANYDEPTH = 2 —— 位深不變,通道數 = ?(在VS中測試為1,灰度圖);
CV_LOAD_IMAGE_ANYCOLOR = 4 —— 位深 = ?, 通道數不變。

默認是1即CV_LOAD_IMAGE_COLOR,即不管什么,都以三通道彩色圖讀取,即使你圖片是單通道的灰度圖也整成三通道。要保持原圖不變讀取,需要加參數-1,即CV_LOAD_IMAGE_UNCHANGED = -1

6.opencv 圖片保存視頻

 cv::VideoWriter writer("/data_2/everyday/0804/00.avi", CV_FOURCC('D','I','V','X'), 30.0, cv::Size(1125,589));
 writer<<img;

注意,img的size需要一致!!!!! 和定義VideoWriter的時候需要一樣

opencv roi 貼圖 img2.copyTo(img(rt));

//img2是roi圖, rt和roi大小需要一樣!!!!

int main()
{
    Mat img = imread("/data_2/fengjing.jpeg");
    Mat img_src = img.clone();
    Mat img2 = imread("/data_2/dog.jpg");
    Rect rt = Rect(100,100,560,553);
    img2.copyTo(img(rt)); //img2是roi圖, rt和roi大小需要一樣!!!!

    namedWindow("src",0);
    imshow("src",img_src);
    namedWindow("roi",0);
    imshow("roi",img2);
    namedWindow("merge",0);
    imshow("merge",img);
    waitKey(0);
}

圖片保持長寬比,縮放到固定尺寸

    int input_w = 512;
    int input_h = 512;
    float scale = cv::min(float(input_w)/img.cols,float(input_h)/img.rows);
    auto scaleSize = cv::Size(img.cols * scale,img.rows * scale);

    cv::Mat resized;
    cv::resize(img, resized,scaleSize,0,0);

    cv::Mat cropped = cv::Mat::zeros(input_h,input_w,CV_8UC3);
    cv::Rect rect((input_w- scaleSize.width)/2, (input_h-scaleSize.height)/2, scaleSize.width,scaleSize.height);

    resized.copyTo(cropped(rect));

c++讀取路徑下所有文件路徑

#include <dirent.h>

static inline int read_files_in_dir(const char *p_dir_name, std::vector<std::string> &file_names) {
    DIR *p_dir = opendir(p_dir_name);
    if (p_dir == nullptr) {
        return -1;
    }

    struct dirent* p_file = nullptr;
    while ((p_file = readdir(p_dir)) != nullptr) {
        if (strcmp(p_file->d_name, ".") != 0 &&
            strcmp(p_file->d_name, "..") != 0) {
            //std::string cur_file_name(p_dir_name);
            //cur_file_name += "/";
            //cur_file_name += p_file->d_name;
            std::string cur_file_name(p_file->d_name);
            file_names.push_back(cur_file_name);
        }
    }

    closedir(p_dir);
    return 0;
}

caffe 打印blob

template <typename Dtype>
void prit_blob(Blob<Dtype>* blob_tmp)
{
  std::cout<<"-------------------------start print blob---------------------------"<<std::endl;
  std::cout<<"bottom shape="<<blob_tmp->shape_string()<<std::endl;
   Dtype * p = blob_tmp->mutable_cpu_data();
   for(int i=0;i<blob_tmp->count();i++)
   {
     std::cout<<p[i]<<std::endl;
   }

  std::cout<<"-------------------------end print blob---------------------------"<<std::endl;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM