C++ opencv4 CNN(卷積神經網路) 範例

C++ opencv4 CNN(卷積神經網路) 範例

C++ opencv4 CNN(卷積神經網路) 範例


資料來源: chatgpt/gemini


chatgpt code

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

using namespace cv;
using namespace cv::dnn;
using namespace std;

int main()
{
    // Load the MNIST dataset - OpenCV can work with pre-trained models.
    // For simplicity, this example assumes that you are using a pre-trained model.
    // You can use any other CNN architecture if needed.

    // Example of loading a pre-trained model (in this case, from TensorFlow or a similar source)
    String modelConfiguration = "path_to_model/config.prototxt";  // Replace with your model configuration file
    String modelWeights = "path_to_model/weights.caffemodel";  // Replace with your model weights file

    // Load the pre-trained model
    Net net = readNetFromCaffe(modelConfiguration, modelWeights);

    // Check if the network was loaded correctly
    if (net.empty()) {
        cerr << "Failed to load the network!" << endl;
        return -1;
    }

    // Load an image (for testing, using a sample image from MNIST or another dataset)
    Mat img = imread("path_to_sample_image.jpg", IMREAD_GRAYSCALE); // Replace with your image path

    if (img.empty()) {
        cerr << "Failed to load image!" << endl;
        return -1;
    }

    // Preprocessing: Resize and normalize image
    Mat blob = blobFromImage(img, 1.0, Size(28, 28), Scalar(0), true, false);

    // Set the input to the network
    net.setInput(blob);

    // Run forward pass to get the output
    Mat output = net.forward();

    // Post-process the output to get the classification result
    Point classId;
    double confidence;
    minMaxLoc(output, 0, &confidence, 0, &classId);

    // Output the result
    cout << "Predicted class: " << classId.x << ", Confidence: " << confidence << endl;

    return 0;
}


gemini code

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>

#include <opencv2/dnn.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>

using namespace cv;
using namespace cv::dnn;
using namespace std;

int main() {
    // 1. 設定模型和類別名稱檔案的路徑
    string modelPath = "path/to/your/pretrained_model.pb"; // 替換成你的模型檔案路徑
    string classesPath = "path/to/your/synset_words.txt";   // 替換成你的類別名稱檔案路徑
    string imagePath = "path/to/your/image.jpg";           // 替換成你想測試的圖像路徑

    // 2. 載入類別名稱
    vector<string> classes;
    ifstream ifs(classesPath.c_str());
    string line;
    while (getline(ifs, line)) {
        classes.push_back(line);
    }

    // 3. 載入預訓練模型
    Net net = readNet(modelPath);

    // 檢查模型是否成功載入
    if (net.empty()) {
        cerr << "Error: Could not load network." << endl;
        return -1;
    }

    // 4. 讀取輸入圖像
    Mat frame = imread(imagePath);
    if (frame.empty()) {
        cerr << "Error: Could not read image." << endl;
        return -1;
    }

    // 5. 創建一個 blob 作為模型的輸入
    Mat blob = blobFromImage(frame, 1.0/255.0, Size(224, 224), Scalar(0, 0, 0), true, false);

    // 6. 將 blob 設定為網路的輸入
    net.setInput(blob);

    // 7. 進行前向傳播以獲得輸出
    Mat outputs = net.forward();

    // 8. 尋找具有最高信心的類別
    Mat prob;
    Point classIdPoint;
    double confidence;
    minMaxLoc(outputs.reshape(1, 1), 0, &confidence, 0, &classIdPoint);
    int classId = classIdPoint.x;

    // 9. 取得預測的類別名稱
    string label = classes[classId];

    // 10. 在圖像上繪製預測結果
    stringstream ss;
    ss << fixed << setprecision(2) << confidence * 100;
    string text = label + " : " + ss.str() + "%";
    putText(frame, text, Point(10, 30), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 255, 0), 2);

    // 11. 顯示結果圖像
    imshow("CNN Output", frame);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *