Quantcast
Channel: OpenCV Q&A Forum - Latest question feed
Viewing all articles
Browse latest Browse all 600

Why am I Getting distorted images after sending them from C# to OpenCV in C++?

$
0
0
I created a C DLL out of my C++ class which uses OpenCV for image manipulations and want to use this dll in my C# application. Currently, this is how I have implemented it : #ifdef CDLL2_EXPORTS #define CDLL2_API __declspec(dllexport) #else #define CDLL2_API __declspec(dllimport) #endif #include "../classification.h" extern "C" { CDLL2_API void Classify_image(unsigned char* img_pointer, unsigned int height, unsigned int width, char* out_result, int* length_of_out_result, int top_n_results = 2); //... } C# related code :DLL Import section: //Dll import [DllImport(@"CDll2.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] static extern void Classify_Image(IntPtr img, uint height, uint width, byte[] out_result, out int out_result_length, int top_n_results = 2); The actual function sending the image to the DLL: //... //main code private string Classify(int top_n) { byte[] res = new byte[200]; int len; Bitmap img = new Bitmap(txtImagePath.Text); BitmapData bmpData = img.LockBits(new Rectangle(0, 0, img.Width, img.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); Classify_Image(bmpData.Scan0, (uint)bmpData.Height, (uint)bmpData.Width, res, out len, top_n); img.UnlockBits(bmpData); //Remember to unlock!!! //... } and the C++ code in the DLL : CDLL2_API void Classify_Image(unsigned char* img_pointer, unsigned int height, unsigned int width, char* out_result, int* length_of_out_result, int top_n_results) { auto classifier = reinterpret_cast(GetHandle()); cv::Mat img = cv::Mat(height, width, CV_8UC3, (void*)img_pointer, Mat::AUTO_STEP); std::vector result = classifier->Classify(img, top_n_results); //... *length_of_out_result = ss.str().length(); } This works prefectly with some images but it doesnt work with others, for example when I try to imshow the image in the Classify_Image, right after being created form the data sent by C# application, I am faced with images like this : problematic example: ![image description](/upfiles/1502972792705612.jpg) fine example : ![image description](/upfiles/15029728437554325.jpg) Here are the original images for further investigations(may be nsfw for some people so I place the link) : http://answers.opencv.org/upfiles/15029729463967486.jpg http://answers.opencv.org/upfiles/15029729777606505.jpg My own thought about the cause of the issue, is I am creating the image regardless of its true type, (setting all images to `CV_8UC3` and `Mat::AUTO_STEP`. thats why some images are fine and some others are not. The problem is, I dont know how I'm supposed to assign the correct type to each image at creation time back in C++. (if thats the cause for such issue, if it is not then I have no idea what else could be doing this) Any help is greatly appreciated .

Viewing all articles
Browse latest Browse all 600

Trending Articles