opencv的松果识别

树上松果分析出RGB,进行RGB色差运算,通过使用二值化初步分割果实和背景,怎么使用opencv的c++去实现

参考一下,不喜勿喷

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

using namespace std;
using namespace cv;

int main(int argc, char **argv) {
    // 读入原始图像
    Mat img = imread("pinecone.png");
    if (img.empty()) {
        cerr << "Failed to load image!" << endl;
        return -1;
    }

    // 提取RGB通道
    vector<Mat> channels;
    split(img, channels);

    // 计算色差图像
    Mat diff1, diff2;
    subtract(channels[0], channels[1], diff1); // R - G
    subtract(channels[1], channels[2], diff2); // G - B

    // 合并色差图像
    Mat diff;
    addWeighted(diff1, 0.5, diff2, 0.5, 0, diff);

    // 二值化分割
    Mat binary;
    threshold(diff, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);

    // 显示结果
    namedWindow("Original", WINDOW_NORMAL);
    namedWindow("Diff", WINDOW_NORMAL);
    namedWindow("Binary", WINDOW_NORMAL);
    imshow("Original", img);
    imshow("Diff", diff);
    imshow("Binary", binary);
    waitKey(0);
    destroyAllWindows();

    return 0;
}


不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/175050
  • 这篇博客你也可以参考下:opencv + c++RGB图像颜色分离和通道合并
  • 除此之外, 这篇博客: opencv利用摄像头对指定颜色的目标进行识别中的 RGB: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    1. RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和,越混合亮度越高,即加法混合。
    2. 红、绿、蓝三个颜色通道每种色各分为256阶亮度,在0时“灯”最弱——是关掉的,而在255时“灯”最亮。当三色灰度数值相同时,产生不同灰度值的灰色调,即三色灰度都为0时,是最暗的黑色调;三色灰度都为255时,是最亮的白色调。
    3. 在电脑中,RGB的所谓“多少”就是指亮度,并使用整数来表示。通常情况下,RGB各有256级亮度,用数字表示为从0、1、2…直到255。注意虽然数字最高是255,但0也是数值之一,因此共256级。
      在这里插入图片描述

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

#include <opencv2/opencv.hpp>  
#include <iostream>  
  
using namespace cv;  
using namespace std;  
  
int main()  
{  
    Mat image = imread("tree_with_pine_nuts.jpg");  
    if (image.empty())  
    {  
        cout << "Failed to read image" << endl;  
        return -1;  
    }  
  
    // 分割图像  
    Mat gray;  
    cvtColor(image, gray, COLOR_BGR2GRAY);  
    Mat binary;  
    threshold(gray, binary, 0, 255, THRESH_BINARY+THRESH_OTSU);  
  
    // 计算色差  
    Mat color;  
    cvtColor(binary, color, COLOR_GRAY2BGR);  
    Mat diff;  
    absdiff(color, color, diff);  
  
    // 显示结果  
    namedWindow("Pine Nuts", WINDOW_NORMAL);  
    imshow("Pine Nuts", color);  
    namedWindow("Difference", WINDOW_NORMAL);  
    imshow("Difference", diff);  
    waitKey(0);  
  
    return 0;  
}