Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中标记兴趣点+;_C++_Matlab_Opencv - Fatal编程技术网

C++ 在C+中标记兴趣点+;

C++ 在C+中标记兴趣点+;,c++,matlab,opencv,C++,Matlab,Opencv,我的项目的目标是检测肺结节,经过过滤和分类后,我得到了如下二值图像: 我的问题是我不知道如何在原始图像上标记这些兴趣点。在matlab中,我可以使用[hold on-off]循环和一些plot()函数轻松实现。但是我如何在C++中做这件事,我不是要把MATLAB代码翻译成C++,我只需要用任何必要的标记来标记原始图像上的这些POI。 以下是我想要的结果: 我用Matlab做的 编辑:我已经从我的程序中得到了点的位置(正如你在第一幅图像中看到的),我只想在原始图像上绘制它们,就像第二幅图像一样

我的项目的目标是检测肺结节,经过过滤和分类后,我得到了如下二值图像:

我的问题是我不知道如何在原始图像上标记这些兴趣点。在matlab中,我可以使用[hold on-off]循环和一些plot()函数轻松实现。但是我如何在C++中做这件事,我不是要把MATLAB代码翻译成C++,我只需要用任何必要的标记来标记原始图像上的这些POI。 以下是我想要的结果: 我用Matlab做的

编辑:我已经从我的程序中得到了点的位置(正如你在第一幅图像中看到的),我只想在原始图像上绘制它们,就像第二幅图像一样

您是否尝试过:

Mat image;
image = imread(filename, CV_LOAD_IMAGE_COLOR); 
然后用在上面

在“可能”上,如果您不知道坐标,但您仅使用

获得过滤后的图像,您是否尝试过:

Mat image;
image = imread(filename, CV_LOAD_IMAGE_COLOR); 
然后用在上面

如果您不知道坐标,但使用

获得过滤后的图像,请尝试以下操作

从二值图像中可以提取轮廓。 然后直接绘制轮廓,或者提取覆盖整个轮廓的边界圆

我将介绍这两种方法

int main()
{
    cv::Mat input = cv::imread("../inputData/markMatlab.png");

    cv::Mat gray;
    cv::cvtColor(input, gray, CV_BGR2GRAY);


    cv::Mat binaryImage = gray>0;
    cv::imshow("binary image", binaryImage);
    // here you start

    std::vector<std::vector<cv::Point> > contours;
    cv::findContours(binaryImage, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);

    // either this:
    cv::Mat inputBlobs = input.clone(); // create output image
    for(unsigned int i=0; i<contours.size(); ++i)
    {
        cv::Point2f blobCenter;
        float blobRadius;
        cv::minEnclosingCircle(contours[i], blobCenter, blobRadius);

        cv::circle(inputBlobs, blobCenter, blobRadius, cv::Scalar(0,0,255), 2);
    }

    // or this one:
    cv::Mat inputContours = input.clone();  // create output image
    for(unsigned int i=0; i<contours.size(); ++i)
    {
        cv::drawContours(inputContours, contours, i, cv::Scalar(0,0,255), 2);
    }






    cv::imshow("input", input);
    cv::imshow("input blobs", inputBlobs);
    cv::imshow("input contours", inputContours);
    cv::imwrite("../outputData/markMatlab.png", input);
    cv::imwrite("../outputData/markMatlabBlobs.png", inputBlobs);
    cv::imwrite("../outputData/markMatlabContours.png", inputContours);
    cv::waitKey(0);
    return 0;
}
intmain()
{
cv::Mat input=cv::imread(“../inputData/markMatlab.png”);
cv::席灰色;
cv::CVT颜色(输入,灰色,cv_bgr2灰色);
cv::Mat binaryImage=灰色>0;
cv::imshow(“二进制图像”,二进制图像);
//从这里开始
矢量轮廓;
cv::findContours(二值图像、等高线、cv\u RETR\u外部、cv\u链\u近似值\u无);
//或者:
cv::Mat inputBlobs=input.clone();//创建输出图像
对于(无符号整数i=0;i请尝试此

从二值图像中可以提取轮廓。 然后直接绘制轮廓,或者提取覆盖整个轮廓的边界圆

我将介绍这两种方法

int main()
{
    cv::Mat input = cv::imread("../inputData/markMatlab.png");

    cv::Mat gray;
    cv::cvtColor(input, gray, CV_BGR2GRAY);


    cv::Mat binaryImage = gray>0;
    cv::imshow("binary image", binaryImage);
    // here you start

    std::vector<std::vector<cv::Point> > contours;
    cv::findContours(binaryImage, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);

    // either this:
    cv::Mat inputBlobs = input.clone(); // create output image
    for(unsigned int i=0; i<contours.size(); ++i)
    {
        cv::Point2f blobCenter;
        float blobRadius;
        cv::minEnclosingCircle(contours[i], blobCenter, blobRadius);

        cv::circle(inputBlobs, blobCenter, blobRadius, cv::Scalar(0,0,255), 2);
    }

    // or this one:
    cv::Mat inputContours = input.clone();  // create output image
    for(unsigned int i=0; i<contours.size(); ++i)
    {
        cv::drawContours(inputContours, contours, i, cv::Scalar(0,0,255), 2);
    }






    cv::imshow("input", input);
    cv::imshow("input blobs", inputBlobs);
    cv::imshow("input contours", inputContours);
    cv::imwrite("../outputData/markMatlab.png", input);
    cv::imwrite("../outputData/markMatlabBlobs.png", inputBlobs);
    cv::imwrite("../outputData/markMatlabContours.png", inputContours);
    cv::waitKey(0);
    return 0;
}
intmain()
{
cv::Mat input=cv::imread(“../inputData/markMatlab.png”);
cv::席灰色;
cv::CVT颜色(输入,灰色,cv_bgr2灰色);
cv::Mat binaryImage=灰色>0;
cv::imshow(“二进制图像”,二进制图像);
//从这里开始
矢量轮廓;
cv::findContours(二值图像、等高线、cv\u RETR\u外部、cv\u链\u近似值\u无);
//或者:
cv::Mat inputBlobs=input.clone();//创建输出图像

对于(unsigned int i=0;i您需要一个库来开始。试试OpenCV,它是一个图像处理库。我正在使用OpenCV,但我不知道如何标记这些POI,这就是问题所在。在标记了兴趣点之后,您希望图像是什么样子?如果我知道您想要实现的目标,我可能会提出一些建议,但我不完全确定你所说的“标记这些兴趣点”是什么意思。这是我想要的结果,我是在matlab中做的。你的意思是你想点击一个图像位置并获得该位置的像素坐标?你可以使用openCV回调函数,但如果你想开发一个真正的程序(而不是测试工具)你应该使用一些真正的gui库,比如QT。你需要一个库来开始。试试OpenCV,它是一个图像处理库。我正在使用OpenCV,但我不知道如何标记这些POI,这就是问题所在。在标记了兴趣点之后,你希望图像是什么样子?如果我知道什么,我可能会提出一些建议您正在尝试实现,但我不完全确定您所说的“标记这些兴趣点”是什么意思。这是我想要的结果,我是在matlab中完成的。您的意思是您想单击图像位置并获得该位置的像素坐标?您可以使用openCV回调函数,但如果您想开发一个真正的程序(而不是测试工具)你应该使用一些真正的gui库,比如qtit's worked!!我不知道这个方法。谢谢你这么多的启发。它奏效了!!我不知道这个方法。谢谢你这么多的启发。