Member 13565065 Ответов: 1

Я хочу открыть два прозрачных изображения внутри opencv на языке C++


У меня есть 2 прозрачных изображения, которые я хочу, чтобы они были открыты в одном окне в opencv. Приведенный ниже код открывает два изображения, но без альфа-канала, потому что он использует (CV_8UC3) и те изображения, которые прозрачны, мы должны использовать (CV_8UC4), чтобы показать прозрачность, но когда я изменяю код на (CV_8UC4), программа выдает мне ошибку.

Я поставлю # на строку (CV_8UC4);

Я поставлю * на линию ошибки;

//код превратился в 3 части из-за * и #.

корпорация Майкрософт Visual Studio в диалоговом окне ошибки показывает эту ошибку : необработанное исключение в 0x00007FFA48633FB8 в openCV.exe: Майкрософт исключений c++: резюме::исключение на месте 0x0000007563FDEA00 памяти.
и окно консольного приложения показывает следующее : OpenCV Error: Assertion failed (channels() == CV_MAT_CN(dtype)) in cv::Mat::copyTo, file C:\build\master_winpack-build-win64-vc14\opencv\modules\core\src\copy.cpp, строка 272

Подходит ли этот код для того, что я хочу сделать?

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

код есть:

Что я уже пробовал:

void ShowManyImages(string title, int nArgs, ...) {
		int size;
		int i;
		int m, n;
		int x, y;

		// w - Maximum number of images in a row
		// h - Maximum number of images in a column
		int w, h;

		// scale - How much we have to resize the image
		float scale;
		int max;

		// If the number of arguments is lesser than 0 or greater than 12
		// return without displaying
		if (nArgs <= 0) {
			printf("Number of arguments too small....\n");
			return;
		}
		else if (nArgs > 14) {
			printf("Number of arguments too large, can only handle maximally 12 images at a time ...\n");
			return;
		}
		// Determine the size of the image,
		// and the number of rows/cols
		// from number of arguments
		else if (nArgs == 1) {
			w = h = 1;
			size = 300;
		}
		else if (nArgs == 2) {
			w = 2; h = 1;
			size = 1000;
		}
		else if (nArgs == 3 || nArgs == 4) {
			w = 2; h = 2;
			size = 300;
		}
		else if (nArgs == 5 || nArgs == 6) {
			w = 3; h = 2;
			size = 200;
		}
		else if (nArgs == 7 || nArgs == 8) {
			w = 4; h = 2;
			size = 200;
		}
		else {
			w = 4; h = 3;
			size = 150;
		}

		// Create a new 3 channel image
#		Mat DispImage = Mat::zeros(Size(100 + size*w, 60 + size*h), CV_8UC4);

		// Used to get the arguments passed
		va_list args;
		va_start(args, nArgs);

		// Loop for nArgs number of arguments
		for (i = 0, m = 20, n = 20; i < nArgs; i++, m += (0)) {
			// Get the Pointer to the IplImage
			Mat img = va_arg(args, Mat);

			// Check whether it is NULL or not
			// If it is NULL, release the image, and return
			if (img.empty()) {
				printf("Invalid arguments");
				return;
			}

			// Find the width and height of the image
			x = img.cols;
			y = img.rows;

			// Find whether height or width is greater in order to resize the image
			max = (x > y) ? x : y;

			// Find the scaling factor to resize the image
			scale = (float)((float)max / size);

			// Used to Align the images
			if (i % w == 0 && m != 20) {
				m = 20;
				n += 20 + size;
			}

			// Set the image ROI to display the current image
			// Resize the input image and copy the it to the Single Big Image
			Rect ROI(m, n, (int)(x / scale), (int)(y / scale));
			Mat temp; resize(img, temp, Size(ROI.width, ROI.height));
*			temp.copyTo(DispImage(ROI));
		}

		// Create a new window, and show the Single Big Image
		namedWindow(title, 1);
		imshow(title, DispImage);
		waitKey();

		// End the number of arguments
		va_end(args);
	}

	int main(int argc, char** argv)
	{
		Mat img1 = imread("c:\\1.png");
		Mat img2 = imread("c:\\2.png");
		ShowManyImages("Image", 2, img1, img2);

		return 0;
	}

Patrice T

- это дает мне ошибку.
И вы нашли сообщение об ошибке ?

Member 13565065

Я уставился на строку ошибки, но не могу найти причину ошибки.

Patrice T

ЧТО ТАКОЕ СООБЩЕНИЕ ОБ ОШИБКЕ ?

Member 13565065

корпорация Майкрософт Visual Studio в диалоговом окне ошибки показывает эту ошибку::::необработанное исключение в 0x00007FFA48633FB8 в openCV.exe: Майкрософт исключений c++: резюме::exception в памяти расположение 0x0000007563FDEA00. а в консольном приложении окно показывает это::::в формате OpenCV ошибка: ошибка утверждения (каналы() == CV_MAT_CN(dtype)) в резюме::мат::метод CopyTo, файл C:\build\master_winpack-build-win64-vc14\opencv\modules\core\src\copy.cpp, линия 272

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

Member 13565065

спасибо, что я обновил свой вопрос.
Но есть ли у вас какие - нибудь идеи по поводу этой проблемы?

Patrice T

Нет, извините

Member 13565065

в любом случае спасибо

1 Ответов

Рейтинг:
2

KarstenK

Вы смешиваете два типа изображений, один с 3 плоскостями, а другой с дополнительным слоем прозрачности, который требует больше памяти.

Вы должны обращаться с этими данными по-другому. Утверждение является результатом смешивания этих типов данных. Ознакомьтесь с документацией и это сообщение может дать вам подсказку.