JuenTingShie   ·  4年前
4 貼文  ·  2 留言

Cpp 找不到 opencv 的那些解決方法

前情提要

因為是學校的作業,老師開了叢集給我們用,但是卻不知道為甚麼找不到libopencv-dev(就是不能直接
include拉QQ)

那要怎麼解決咧?lab大學長給了以下的解決辦法:
首先先看到include

//main.cpp
#include <iostream>
//這些都是老師的叢集上的opencv的位置
#include  <opencv4/opencv2/core/core.hpp>
#include  <opencv4/opencv2/imgcodecs/imgcodecs.hpp>

先指定好lib的位置
每include一個額外套件就在bash裡面多加一個小片段:

#bash
g++ main.cpp -o main -I /usr/include/opencv4/ -L /usr/lib -lopencv_core -lopencv_imgcodecs
                        ^opencv_lib              ^lib      ^1            ^2

然後就可以拉! BTW原本的本機檔案是有寫個waitkey(0),但是在叢集上就沒辦法show GUI了對吧,所以就拿掉了。

說明一下結論在做的事

我去NASA上面找到了幾張 世 界 大 的地球圖片,然後呢我想要找出藍藍的海洋的面積,於是想要用
pixel數量來算出總共有多少pixel,所以先把不是海洋的地方都變成白色的,海洋變成黑色的,在計算黑色
pixel的數量就好了。

那Makefile的設定呢?嘿嘿之後再放上來好惹
Full code:

#include <iostream>
#include <opencv4/opencv2/core/core.hpp>
#include <opencv4/opencv2/imgcodecs/imgcodecs.hpp>

using namespace cv;
using namespace std;
//
#pragma once
#include <chrono>
class stopWatch {
    std::chrono::time_point<std::chrono::steady_clock> t1, t2;

  public:
    stopWatch();
    void   start(void);
    void   stop(void);
    double elapsedTime(void);
};
stopWatch::stopWatch() {
    t1 = t2 = std::chrono::steady_clock::now();
}
void stopWatch::start() {
    t1 = std::chrono::steady_clock::now();
}

void stopWatch::stop() {
    t2 = std::chrono::steady_clock::now();
}

double stopWatch::elapsedTime() {
    auto duration = t2 - t1;
    return std::chrono::duration<double, std::micro>(t2 - t1).count() / 1.0e6;
}
//
bool isGreen(const Vec3b &color) {
    if (color[0] < color[1]) {
        return true;
    } else {
        return false;
    }
};
bool isBlue(const Vec3b &color) {
    if ((135 < color[0] && color[0] < 255)) {
        if (isGreen(color)) {
            return false;
        } else {
            return true;
        }
    } else {
        return false;
    }
};
bool isWhite(const Vec3b &color) {
    if (225 < color[0] && 225 < color[1] && 225 < color[2]) {
        return true;
    } else {
        return false;
    }
};
int main(int argc, char **argv) {
    // argv[1] = image path
    stopWatch t[2];
    t[0].start();
    Mat image = imread(argv[1]);
    for (int y = 0; y < image.rows; y++) {
        for (int x = 0; x < image.cols; x++) {
            Vec3b &color = image.at<Vec3b>(y, x);
            if (isBlue(color)) {
                for (int i = 0; i < sizeof(color) / sizeof(color[0]); i++) {
                    color[i] = 255;
                }
            } else if (isGreen(color)) {
                for (int i = 0; i < sizeof(color) / sizeof(color[0]); i++) {
                    color[i] = 255;
                }
            } else if (isWhite(color)) {
                for (int i = 0; i < sizeof(color) / sizeof(color[0]); i++) {
                    color[i] = 255;
                }
            } else {
                for (int i = 0; i < sizeof(color) / sizeof(color[0]); i++) {
                    color[i] = 0;
                }
            }
        }
    }
    t[0].stop();
    t[1].start();
    int black, white = 0;
    for (int y = 0; y < image.rows; y++) {
        for (int x = 0; x < image.cols; x++) {
            Vec3b &color = image.at<Vec3b>(y, x);
            if (color[0] == 0) {
                black++;
            } else {
                white++;
            }
        }
    }
    t[1].stop();

    // namedWindow("Image", WINDOW_AUTOSIZE);
    // imshow("Image", image);
    imwrite("resize_out.png", image);
    cout << "Black: " << black << " White: " << white << endl;
    int ti = 1;
    for (auto &i : t) {
        cout << "t[" << ti << "]" << i.elapsedTime() << ", ";
        ti++;
    }
    cout << endl;
    return 0;
}
  分享   共 1,972 次點閱
按了喜歡:
共有 3 則留言
尤川豪   ·  4年前
445 貼文  ·  275 留言

謝謝加入筆記&分享的行列!這些都會對後人很有幫助!👍👍👍

 
JuenTingShie   ·  4年前
4 貼文  ·  2 留言

您好,在PTT上面看到的推廣的文章就來使用看看了。自己本身蠻喜歡Markdown的邏輯,初次嘗鮮論壇

尤川豪   ·  4年前
445 貼文  ·  275 留言

使用上有什麼建議或想法歡迎再跟我說!👍👍👍

 
您的留言
JuenTingShie
4 貼文  ·  2 留言

HPCL菜渣

查看所有文章