При добавлении текста в местоположение мыши по щелчку дает ошибку сегментации - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь написать код для программы, в которой, когда пользователь нажимает на изображение в выбранном месте, я должен отображать его значения RGB.

Я просмотрел документацию OpenCV и обнаружил, что функция putText поможет мне достичь желаемых результатов. Я написал код, следуя документации в OpenCV.

Вот мой код

cv::Mat img;
void mouse_Callback(int event , int x , int y , int flag ,void *params)
{
    if(event == cv::EVENT_LBUTTONDOWN)
    {
        cv::Vec3b vec = img.at<cv::Vec3b>(x,y);
        int b,g,r;
        b = (int)vec(0);
        g = (int)vec(1);
        r = (int)vec(2);

        cv::String st = to_string(b);
        cout << b << endl;
        cv::putText(img,st,cv::Point2i(x,y),cv::FONT_HERSHEY_COMPLEX_SMALL, 0.8, cvScalar(255,100,250), 1, CV_AA);

        cv::imshow("image",img);
    }
}

int main()
{
    cv::namedWindow("image",CV_WINDOW_AUTOSIZE);
    img = cv::imread("1.jpg",-1);

    cv::setMouseCallback("image",mouse_Callback);

    cv::imshow("image",img);

    char key = cv::waitKey(0);
    if(key==27)
    {
        cv::destroyAllWindows();
    }
    return 0;
}

После выполнения кода в течение первых двух или трех щелчков я получаю правильный вывод, после чего я получаю ошибку сегментации.

Спасибо.

1 Ответ

2 голосов
/ 14 мая 2019

Фактическая проблема находится в функции mouse_Callback(...), более конкретно здесь:

cv::Vec3b vec = img.at<cv::Vec3b>(x, y);

Глядя на документацию OpenCV по оператору .at, мы видим, что первый параметр указывает индекс строки, а второй параметр - индекс столбца. Теперь, когда вы работаете с координатами изображения (x, y), например, выбирается из щелчка мышью на изображении, тогда x соответствует индексу столбца, а y индексу строки!

Итак, простое решение - просто переключить x и y:

cv::Vec3b vec = img.at<cv::Vec3b>(y, x);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...