Четыре камеры в одном окне [дубликат]

С точки зрения производительности лучше всего использовать отсортированный список, чтобы данные сортировались по мере добавления к результату. Другие подходы нуждаются, по крайней мере, в одной дополнительной итерации по данным, и большинство из них создают копию данных, поэтому будет затронута не только производительность, но и использование памяти. Не может быть проблемой с несколькими сотнями элементов, но будет с тысячами, особенно в тех службах, где одновременно может выполняться сортировка нескольких параллельных запросов. Посмотрите на пространство имен System.Collections.Generic и выберите класс с сортировкой вместо списка.

И избегайте общих реализаций, используя отражение, когда это возможно, это также может вызвать проблемы с производительностью.

17
задан Jorge Vega Sánchez 23 February 2011 в 11:56
поделиться

6 ответов

Вы можете найти ответ на OpenCV Wiki:

https://github.com/opencv/opencv/wiki/DisplayManyImages

: -)

14
ответ дан Tae-Sung Shin 17 August 2018 в 19:02
поделиться

Я реализовал это совсем недавно. Так подумал об обмене. Он использует C ++ API. Код не требует пояснений (надеюсь).

    /**
     * @brief makeCanvas Makes composite image from the given images
     * @param vecMat Vector of Images.
     * @param windowHeight The height of the new composite image to be formed.
     * @param nRows Number of rows of images. (Number of columns will be calculated
     *              depending on the value of total number of images).
     * @return new composite image.
     */
    cv::Mat makeCanvas(std::vector<cv::Mat>& vecMat, int windowHeight, int nRows) {
            int N = vecMat.size();
            nRows  = nRows > N ? N : nRows; 
            int edgeThickness = 10;
            int imagesPerRow = ceil(double(N) / nRows);
            int resizeHeight = floor(2.0 * ((floor(double(windowHeight - edgeThickness) / nRows)) / 2.0)) - edgeThickness;
            int maxRowLength = 0;

            std::vector<int> resizeWidth;
            for (int i = 0; i < N;) {
                    int thisRowLen = 0;
                    for (int k = 0; k < imagesPerRow; k++) {
                            double aspectRatio = double(vecMat[i].cols) / vecMat[i].rows;
                            int temp = int( ceil(resizeHeight * aspectRatio));
                            resizeWidth.push_back(temp);
                            thisRowLen += temp;
                            if (++i == N) break;
                    }
                    if ((thisRowLen + edgeThickness * (imagesPerRow + 1)) > maxRowLength) {
                            maxRowLength = thisRowLen + edgeThickness * (imagesPerRow + 1);
                    }
            }
            int windowWidth = maxRowLength;
            cv::Mat canvasImage(windowHeight, windowWidth, CV_8UC3, Scalar(0, 0, 0));

            for (int k = 0, i = 0; i < nRows; i++) {
                    int y = i * resizeHeight + (i + 1) * edgeThickness;
                    int x_end = edgeThickness;
                    for (int j = 0; j < imagesPerRow && k < N; k++, j++) {
                            int x = x_end;
                            cv::Rect roi(x, y, resizeWidth[k], resizeHeight);
                            cv::Size s = canvasImage(roi).size();
                            // change the number of channels to three
                            cv::Mat target_ROI(s, CV_8UC3);
                            if (vecMat[k].channels() != canvasImage.channels()) {
                                if (vecMat[k].channels() == 1) {
                                    cv::cvtColor(vecMat[k], target_ROI, CV_GRAY2BGR);
                                }
                            } else {             
                                vecMat[k].copyTo(target_ROI);
                            }
                            cv::resize(target_ROI, target_ROI, s);
                            if (target_ROI.type() != canvasImage.type()) {
                                target_ROI.convertTo(target_ROI, canvasImage.type());
                            }
                            target_ROI.copyTo(canvasImage(roi));
                            x_end += resizeWidth[k] + edgeThickness;
                    }
            }
            return canvasImage;
    }

Вот пример вывода. Composite image made of multiple images [/g0]

18
ответ дан 6 revs 17 August 2018 в 19:02
поделиться
  • 1
    как мы можем изменить его, чтобы показать изображения в оттенках серого? потому что я попробовал, и он работает только для цветных изображений. – Maystro 14 January 2015 в 16:59
  • 2
    @Maystro: Я изменил код для поддержки оттенков серого и цветных изображений. – vinvinod 19 February 2015 в 11:57
  • 3
    Я думаю, это лучшее решение. В любом случае мне пришлось немного изменить его, потому что вы забыли скопировать данные vecMat [k] в target_ROI Mat в случае цветных изображений. – Joe Aspara 13 December 2015 в 10:45

Или просто используйте:

Mat a, Mat b, Mat dst // a,b loaded

cv::hconcat(a, b, dst) // horizontal
cv::vconcat(a, b, dst) // vertical

Mat dst -> | a | b |

или сделать это с помощью вектора:

std::vector<cv::Mat> matrices = {
            a, b
    };
hconcat(matrices, dst);
5
ответ дан Antonín Vrba 17 August 2018 в 19:02
поделиться

Ответ зависит от того, какой интерфейс вы используете (C или C ++). Общий рабочий процесс

  • Создайте изображение (cv::Mat для C ++, IplImage* для C), достаточно большое для размещения вашего скомпонованного изображения
  • Скопируйте изображения в большое изображение C ++: используйте конструктор Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange), чтобы получить cv::Mat, указывающий на субимость исходного окна, а затем используйте метод copyTo для копирования небольшого изображения в большой. C: установите ROI на большом изображении и скопируйте ваше маленькое изображение в него
  • Отобразите ваше большое изображение
7
ответ дан etarion 17 August 2018 в 19:02
поделиться

GUI, включенный в OpenCV, довольно ограничен, если вам нужно что-то сделать сложнее, вам действительно нужно использовать GUI-инфраструктуру, такую ​​как QT или VC ++ для windows

-1
ответ дан macarthy 17 August 2018 в 19:02
поделиться
  • 1
    Я работаю с MAC. Но теперь я только хочу работать с каркасом OpenCV. Я знаю, что в будущем необходимо использовать внешнюю структуру, чтобы иметь больше возможностей. Спасибо за Ваш ответ. – Jorge Vega Sánchez 23 February 2011 в 17:03
0
ответ дан Adil B 29 October 2018 в 18:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: