Программа C++ зависает на команде imshow

У меня есть некоторый C++-код, который почему-то висит. Это код:

using namespace std;
using namespace cv; 


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

cout <<"started";
Mat im(256, 256, CV_8UC1, cv::Scalar(255));
for (int j = 0; j < 255; j++) {
    for (int k = 0; k < 255; k++) {

        if (k > j) {
            cv::Mat black(im, cv::Rect(j, k, 1, 1));
            black = cv::Scalar(0, 0, 0);
        }

    }
}

Mat image2;
//cvtColor(image, image2, CV_BGR2GRAY);
cout<<"started";
imshow("", im);
waitKey(0);

return 0;
}

Теперь, я пробовал это уже 3 дня, буквально стирая каждую строку этого кода и возвращая его обратно, все сводится к:

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

Странно то, что я дословно скопировал из своей старой программы, она работала, даже работала в новом проекте день, а потом ВНЕЗАПНО начала зависать, то есть программа просто работает и работает без какого-либо результата и ее нельзя закрыть вниз.

Очевидно, я должен упускать из виду что-то действительно основное здесь, но я просто не могу его найти.

Помогите, пожалуйста?

Моя ОС Ubuntu 15.10. Кроме того, я только что попробовал ответ SSteves => та же проблема. Значит, это какая-то утечка памяти, а не мой код, верно? Как, черт возьми, вы исправляете утечки памяти?


person user1862770    schedule 27.02.2016    source источник
comment
Я не вижу команду imshow в вашем коде?   -  person Emily L.    schedule 27.02.2016
comment
О том же думал.   -  person Evan Carslake    schedule 27.02.2016
comment
Возможный дубликат cv::imshow иногда работает очень медленно   -  person Evan Carslake    schedule 27.02.2016
comment
В вашем коде несколько проблем. Что именно вы пытались сделать? Можете объяснить алгоритм?   -  person karlphillip    schedule 27.02.2016
comment
Алгоритм в значительной степени дает мне только квадратное матовое изображение, половина которого белая, а другая половина черная, причем две половины разделены по диагонали. Это изображение будет im. Я проверил это, эта часть работает. Даже показ изображения работал нормально до двух дней назад.   -  person user1862770    schedule 27.02.2016
comment
Кроме того, было бы неплохо, если бы кто-то, кто на самом деле отрицает вопрос, хотя бы имел порядочность упомянуть, почему он это сделал, иначе я даже не могу исправить то, что так раздражало человека.   -  person user1862770    schedule 27.02.2016
comment
Чтобы объяснить алгоритм дальше: я перебираю мат (изначально полностью белый) размером 256x256 пикселей за пикселем и рисую прямоугольник размером в один пиксель тогда и только тогда, когда координата y больше, чем координата x   -  person user1862770    schedule 27.02.2016
comment
Вы пытались поместить непустую строку в качестве имени окна в imshow?   -  person Miki    schedule 27.02.2016
comment
да. такой же результат. И вот уже час висит, так что предполагаю, что это не дубликат, как было сказано выше.   -  person user1862770    schedule 27.02.2016


Ответы (1)


Попробуй это. Это работает для меня и делает то, что вы описываете.

#include <iostream>

#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;

int main(int argc, char *argv[]) {
    Mat image(256, 256, CV_8UC1, Scalar(255));
    for (int j = 0; j < 256; j++) { //index goes to < 256, not < 255
        for (int k = j + 1; k < 256; k++) { //start loop at j + 1 to eliminate if (k > j) test
            Mat black(image, Rect(j, k, 1, 1));
            black = Scalar(0); //only one value in Scalar since this is a single-channel image
        }       
    }
    cv::imshow("", image);
    // wait for key
    cv::waitKey(0);

    return 0;
}

черная/белая диагональ

Я сделал пару небольших изменений:

  • Проверка индекса цикла должна быть < 256, а не < 255, если вы специально не хотите изменять последнюю строку или столбец.
  • Вы можете начать внутренний цикл с int k = j + 1, чтобы избежать ненужных итераций цикла и теста if (k > j).
  • Вы устанавливаете black на трехканальное скалярное значение. Мой все еще работает, когда я изменил его на Scalar(0, 0, 0), но вы все равно не должны этого делать.

Я попробовал ваш код, и он также работает. Вы не указали, какая у вас ОС. Я использую OS X.

person SSteve    schedule 28.02.2016
comment
Я скопировал ваш код дословно, => все та же проблема. Моя ОС Ubuntu 15.10 - person user1862770; 28.02.2016
comment
Возможно ли, что окно отображается, но не видно? У меня были ситуации, когда окно OpenCV появляется за другим окном. Или, может быть, в какой-то момент у вас был подключен второй монитор, и он отображался там. - person SSteve; 28.02.2016
comment
нет. нет второго монитора и нет, окно тоже не невидимо. - person user1862770; 28.02.2016
comment
Не уверен, что еще предложить. Код правильный, так что это должно быть что-то с конфигурацией вашей системы. - person SSteve; 29.02.2016