Click here to Skip to main content
15,916,180 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
I have 2 transparent images which I want them to be opened in one window in opencv. The code below opens two images but with out alpha channel because it's using (CV_8UC3) and those images which are transparent we should use (CV_8UC4) to show the transparency but when I change the code to (CV_8UC4) the program gives me an error.

I'll put a # on the line of (CV_8UC4);

I'll put a * on the line of error;

//the code turned to 3 parts because of * and #.

microsoft visual studio error dialog shows this error : Unhandled exception at 0x00007FFA48633FB8 in openCV.exe: Microsoft C++ exception: cv::Exception at memory location 0x0000007563FDEA00.
and the console application window shows this one : 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, line 272

Is this code suitable for what I want to do?

This code opens multiple images but i've use it for two.

code is:

What I have tried:

C++
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;
	}
Posted
Updated 13-Sep-18 1:05am
v6
Comments
Patrice T 15-Aug-18 1:24am    
'gives me an error.'
And you have found the error message ?
Member 13565065 15-Aug-18 1:26am    
I stared the error line but I cant find the reason of the error.
Patrice T 15-Aug-18 1:37am    
WHAT IS THE ERROR MESSAGE ?
Member 13565065 15-Aug-18 1:47am    
microsoft visual studio error dialog shows this error::::Unhandled exception at 0x00007FFA48633FB8 in openCV.exe: Microsoft C++ exception: cv::Exception at memory location 0x0000007563FDEA00. and the console application window shows this one::::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, line 272
Patrice T 15-Aug-18 1:50am    
Use Improve question to update your question.
So that everyone can pay attention to this information.

1 solution

You are mixing two image types, one with 3 planes and the other with an additional transparency layer which needs more memory.

You must handle this data in a different manner. The assertation is the result of mixing that data types. Read the documentation and this posting may give you a hint.
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900