Сбор значений пикселей в линии, нарисованной с помощью мыши

0

У меня есть изображение (24 бит bmp), например следующее:

Изображение 174551

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

Я использовал setMouseCallback() для отображения положения мыши (показано ниже). Но мне нужна дополнительная помощь в понимании элегантного способа поиска и хранения значений пикселей по всей линии. Пожалуйста, помогите!

void CallBackFunc(int event, int x, int y, int flags, void* userdata)
{
     if  ( event == EVENT_LBUTTONDOWN )
     {
          cout << "Left button of the mouse is clicked - position (" << x << ", " << y << ")" << endl;
     }
     else if  ( event == EVENT_RBUTTONDOWN )
     {
          cout << "Right button of the mouse is clicked - position (" << x << ", " << y << ")" << endl;
     }

     else if ( event == EVENT_MOUSEMOVE )
     {
          cout << "Mouse move over the window - position (" << x << ", " << y << ")" << endl;

     }
}

int main(int argc, char** argv)
{

     Mat img = imread("C:\\Users\\Acme\\Desktop\\image-processing\\2.bmp");
     namedWindow(" Window", 1);
     setMouseCallback(" Window", CallBackFunc, NULL);
     imshow(" Window", img);
     waitKey(0);
     return 0;

}
  • 0
    Так что же не так, например, с использованием уравнения линии для вычисления пикселей, через которые проходит линия?
  • 1
    docs.opencv.org/modules/core/doc/...
Показать ещё 3 комментария
Теги:
opencv
image-processing

2 ответа

1

Конкретные детали зависят от вашей программы, но значения заполняются после нажатия двух точек. То, что вы делаете после этого, зависит от вас.

cv::Point g_points[2];
int g_pointIndex;
std::vector<cv::Vec3b> values;
bool g_allGood = false;

void onMouse(int e, int x, int y, int d, void* ud)
{
    if (e != CV_EVENT_LBUTTONDOWN || g_pointIndex >= 2)
        return;

    g_points[g_pointIndex++] = cv::Point(x, y);
}

void main()
{
    // load image as greyscale
    Mat img = imread("C:\\temp\\2.png", CV_8UC1);
    namedWindow("img", 1);

    setMouseCallback("img", onMouse);

    while (1)
    {
        // all points collected
        if (g_pointIndex == 2 && !g_allGood)
        {
            /*
            to save processing, i suggest you remove the mouse callback once all points
            are collected. do this with: setMouseCallback("img", NULL,NULL);
            */

            // create line iterator, and add pixel values to values vector
            cv::LineIterator it(img, g_points[0], g_points[1]);

            for (int i = 0; i < it.count; i++, ++it)
                values.push_back((Vec3b)*it);

            // you now have all pixel values in values;
            g_allGood = true;
        }

        imshow("img", img);
        waitKey(100);
    }

}
  • 0
    Я попытался напечатать значения в значениях: cout << Mat (values) << endl; , но пусто
  • 0
    Я редактировал код. values заполняются значениями и, конечно, не являются пустыми.
Показать ещё 2 комментария
1

Извлеките линию, деформируя ее на 1 x (длина линии) или (длина линии) x 1, вертикальный или горизонтальный Mat. Затем вы можете легко прочитать или передать значения пикселей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню