У меня есть 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 => та же проблема.
Так что, должно быть, какая-то утечка памяти, а не мой код, верно? Как, черт возьми, вы исправляете утечки памяти?
Попробуй это. Это работает для меня и делает то, что вы описываете.
#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.
Других решений пока нет …