void Microsoft2Grabber::GetPointCloudFromColorlessData(const MatDepth &depth, boost::shared_ptr<PointCloud<PointXYZRGBA>> &cloud, bool alignToColor, bool preregistered) const
	{
		if(depth.empty()) {
			cout << "empty depth" << endl;
			return;
		}

		UINT16 *pDepth = (UINT16*)depth.data;
		int length = cDepthHeight * cDepthWidth, length2;
		HRESULT hr;
		if(alignToColor) {
			length2 = cColorHeight * cColorWidth;
			hr = m_pCoordinateMapper->MapColorFrameToCameraSpace(length,pDepth,length2,m_pCameraSpacePoints);
			if(FAILED(hr))
				throw exception("Couldn't map to camera!");
		} else {
			hr = m_pCoordinateMapper->MapDepthFrameToCameraSpace(length,pDepth,length,m_pCameraSpacePoints);
			if(FAILED(hr))
				throw exception("Couldn't map to camera!");
			hr = m_pCoordinateMapper->MapCameraPointsToColorSpace(length,m_pCameraSpacePoints,length,m_pColorCoordinates);
			if(FAILED(hr))
				throw exception("Couldn't map color!");
		}

		PointCloud<PointXYZRGBA>::iterator pCloud = cloud->begin();
		ColorSpacePoint *pColor = m_pColorCoordinates;
		CameraSpacePoint *pCamera = m_pCameraSpacePoints;
		float bad_point = std::numeric_limits<float>::quiet_NaN ();
		int x,y, safeWidth = cColorWidth - 1, safeHeight = cColorHeight - 1;
		int width = alignToColor ? cColorWidth : cDepthWidth;
		int height = alignToColor ? cColorHeight : cDepthHeight;
		for(int j = 0; j < height; j++) {
			for(int i = 0; i < width; i++) {
				PointXYZRGBA loc;
				Vec4b color;
				if(!preregistered && !alignToColor) {
					x = Clamp<int>(int(pColor->X),0,safeWidth);
					y = Clamp<int>(int(pColor->Y),0,safeHeight);
					//int index = y * cColorHeight + x;
					color = Vec4b(255,255,255,255); // img->at<Vec4b>(y,x);
				} else
					color = Vec4b(255,255,255,255); // img->at<Vec4b>(j,i);
				loc.b = color[0];
				loc.g = color[1];
				loc.r = color[2];
				loc.a = 255;
				if(pCamera->Z == 0) {
					loc.x = loc.y = loc.z = bad_point;
				} else {
					loc.x = pCamera->X;
					loc.y = pCamera->Y;
					loc.z = pCamera->Z;
				}
				//cout << "Iter: " << i << ", " << j << endl;
				*pCloud = loc;
				++pCamera; ++pCloud; ++pColor;
			}
		}
		//img->release();
	}
示例#2
0
void cv::viz::vtkImageMatSource::copyRGBAImage(const Mat &source, vtkSmartPointer<vtkImageData> output)
{
    Vec4b* dptr = reinterpret_cast<Vec4b*>(output->GetScalarPointer());
    size_t elem_step = output->GetIncrements()[1]/sizeof(Vec4b);

    for (int y = 0; y < source.rows; ++y)
    {
        Vec4b* drow = dptr + elem_step * y;
        const unsigned char *srow = source.ptr<unsigned char>(y);
        for (int x = 0; x < source.cols; ++x, srow += source.channels())
            drow[x] = Vec4b(srow[2], srow[1], srow[0], srow[3]);
    }
}
示例#3
0
  void MeshRenderer :: renderToImage(cv::Mat4b& image, const Pose3D& pose, int flags)
  {     
    m_pbuffer->makeCurrent();

    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity ();
    if (flags & LIGHTING)
    {
      GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
      GLfloat mat_shininess[] = { 10.0 };
      GLfloat light_position[] = { 1, 1, 1.0, 0.0 };
      glEnable(GL_LIGHTING);
      glShadeModel (GL_SMOOTH);
      glEnable(GL_COLOR_MATERIAL);
      glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
      glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
      glLightfv(GL_LIGHT0, GL_POSITION, light_position);
      glEnable(GL_LIGHT0);
    }

    computeProjectionMatrix(image, pose);

    glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    if (flags & WIREFRAME)
      glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );

    // draw the display list
    glCallList(m_list_index);
    glFlush();

    computeDepthBuffer();
    QImage qimage = m_pbuffer->toImage();
    for (int r = 0; r < qimage.height(); ++r)
    for (int c = 0; c < qimage.width(); ++c)
    {
      QRgb pixel = qimage.pixel(c,r);
      Vec4b color (qBlue(pixel), qGreen(pixel), qRed(pixel), qAlpha(pixel));
      m_color_buffer(r,c) = color;
      float a = qAlpha(pixel)/255.f;
      if (a > 0)
      {
        Vec4b old_color = image(r,c);
        image(r,c) = Vec4b(old_color[0]*(1-a) + color[0]*a,
                           old_color[1]*(1-a) + color[1]*a,
                           old_color[2]*(1-a) + color[2]*a,
                           255);
      }
    }
  }
示例#4
0
void MeshRenderer :: renderToImage(cv::Mat4b& image, int flags)
{
    ntk_assert(m_vertex_buffer_object.initialized,
               "Renderer not initialized! Call setPose and setMesh.");

    ntk::TimeCount tc_gl_current("make_current", 2);
    m_pbuffer->makeCurrent();
    tc_gl_current.stop();

    ntk::TimeCount tc_gl_render("gl_render", 2);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    if (flags & WIREFRAME)
        glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );

    VertexBufferObject& vbo = m_vertex_buffer_object;
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo.vertex_id);

    if (vbo.has_texcoords)
    {
        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, vbo.texture_id);
    }
    else
    {
        glDisable(GL_TEXTURE_2D);
    }

    if (vbo.has_texcoords)
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    if (vbo.has_color)
        glEnableClientState(GL_COLOR_ARRAY);
    else
        glColor3f(1.0f,0.f,0.f);

    glEnableClientState(GL_VERTEX_ARRAY);

    glVertexPointer(3, GL_FLOAT, 0, 0);
    if (vbo.has_color)
        glColorPointer(3, GL_UNSIGNED_BYTE, 0, ((char*) NULL) + vbo.color_offset);

    if (vbo.has_texcoords)
        glTexCoordPointer(2, GL_FLOAT, 0, ((char*) NULL) + vbo.texture_offset);

    if (vbo.has_faces)
    {
        glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vbo.faces_id);
        glNormal3f(0, 0, 1);
        glDrawElements(GL_TRIANGLES, vbo.nb_faces*3, GL_UNSIGNED_INT, 0);

        if (flags & OUTLINE)
        {
            // Draw again for outline.
            glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
            glDrawElements(GL_TRIANGLES, vbo.nb_faces*3, GL_UNSIGNED_INT, 0);
            glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
        }
    }
    else
    {
        glDrawArrays(GL_POINTS,
                     0,
                     vbo.nb_vertices);
    }

    glDisableClientState(GL_VERTEX_ARRAY);

    if (vbo.has_color)
        glDisableClientState(GL_COLOR_ARRAY);

    if (vbo.has_texcoords)
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);

    // bind with 0, so, switch back to normal pointer operation
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);

    if (vbo.has_faces)
    {
        glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
    }

    glFinish();
    tc_gl_render.stop();

    ntk::TimeCount tc_image("to_image", 2);
    QImage qimage = m_pbuffer->toImage();
    tc_image.stop();

    ntk::TimeCount tc_depth_buffer("compute_depth_buffer", 2);
    computeDepthBuffer();
    tc_depth_buffer.stop();

    ntk::TimeCount tc_convert("convert_to_cv", 2);
    for (int r = 0; r < qimage.height(); ++r)
        for (int c = 0; c < qimage.width(); ++c)
        {
            QRgb pixel = qimage.pixel(c,r);
            Vec4b color (qBlue(pixel), qGreen(pixel), qRed(pixel), qAlpha(pixel));
            m_color_buffer(r,c) = color;
            float a = qAlpha(pixel)/255.f;
            if (a > 0)
            {
                Vec4b old_color = image(r,c);
                image(r,c) = Vec4b(old_color[0]*(1-a) + color[0]*a,
                                   old_color[1]*(1-a) + color[1]*a,
                                   old_color[2]*(1-a) + color[2]*a,
                                   255);
            }
        }
    tc_convert.stop();
}
示例#5
0
void FPScreenMirror::reinitialize() {

	RECT keyDim = LEDController::getInstance()->getKeyBoardDimensions(allKeys);

	keyboardWidth = keyDim.right;
	keyboardHeight = keyDim.bottom;

	if (!captureWindowHDC || !currentProcessHWND) {
		return;
	}

	RECT targetRect;
	GetWindowRect(currentProcessHWND, &targetRect);

	int clientWidth = targetRect.right - targetRect.left; // -offsetLeft - offsetRight;
	int clientHeight = targetRect.bottom - targetRect.top; // -offsetTop - offsetBottom;


	// targetWidth = uiWidth - marginLeft * 2;
	// float aspectRatio = (float)keyboardHeight / (float)keyboardWidth;
	// targetHeight = (int)floor(targetWidth * aspectRatio);
	keyboardZoomFactor = (float)(clientWidth - offsetLeft - offsetRight) / (float)keyboardWidth;
	uiZoom = (float)targetWidth / (float)clientWidth;

	// create Alpha Screenhot Mask
	int cB = 80;
	if (mask) {
		delete mask;
	}
	mask = new Mat4b(targetHeight, targetWidth, CV_8UC4);
	for (int i = 0; i < cB; i++) {
		int c = (int)floor((float)i / (float)cB * (float)192);
		Scalar color(c, c, c, 255);
		cv::rectangle(*mask, cv::Point((int)floor(i), i), cv::Point(targetWidth - (int)floor(i), targetHeight - i), color, CV_FILLED, 8, 0);
	}

	// keyboard graphics
	int keyShadowSize = 4;

	if (keyboardFx) {
		delete keyboardFx;
	}
	keyboardFx = new Mat4b(targetHeight, targetWidth, Vec4b(0, 0, 0, 0));
	
	vector<CorsairLedPosition>::iterator it;
	it = allKeys.begin();
	for (; it != allKeys.end(); ) {
		cv::Rect keyRect(
			(int)floor((float)(it->left*keyboardZoomFactor + offsetLeft)*uiZoom * offsetScaleX),
			(int)floor((float)(it->top*keyboardZoomFactor + offsetTop)*uiZoom* offsetScaleY),
			(int)floor((float)it->width*keyboardZoomFactor*uiZoom * offsetScaleX),
			(int)floor((float)it->height*keyboardZoomFactor*uiZoom* offsetScaleY));

		for (int i = keyShadowSize; i > 0; i--) {
			int c = (int)floor((float)(keyShadowSize - i) / (float)keyShadowSize * (float)192);
			Scalar color(0, 0, 0, c);
			cv::rectangle(*keyboardFx, cv::Rect(keyRect.x - i, keyRect.y - (int)floor((float)i / 2), keyRect.width + i * 2, keyRect.height + i * 2), color, CV_FILLED, 8, 0);
		}
		++it;
	}

	initialized = true;
}
示例#6
0
int CPoissonExt:: prepare(int side, cv::Mat &extends)
{
	int size=0;
	int sign;
	cv::Mat *image;
	if(side==1)
		sign=1,image=&_image2;
	else
		sign=-1,image=&_image1;


	for(int y=0;y<h+ex*2;y++)
	 for (int x=0;x<w+ex*2;x++)
	{
		int ii=y*(w+2*ex)+x;
	    if((extends.at<Vec4b>(y,x))[3]>0)
		{
			type[ii]=2;
			index[ii]=size++;
		}
		else
		{
			//4ÁÚÓò
			if(y>0&&(extends.at<Vec4b>(y-1,x))[3]>0)
			{
				type[ii]=1;
				index[ii]=size++;
				continue;
			}
			if(y<h+ex*2-1&&(extends.at<Vec4b>(y+1,x))[3]>0)
			{
				type[ii]=1;
				index[ii]=size++;
				continue;
			}
			if(x>0&&(extends.at<Vec4b>(y,x-1))[3]>0)
			{
				type[ii]=1;
				index[ii]=size++;
				continue;
			}
			if(x<w+ex*2-1&&(extends.at<Vec4b>(y,x+1))[3]>0)
			{
				type[ii]=1;
				index[ii]=size++;
				continue;
			}

			type[ii]=0;
		}
	}


	#pragma omp parallel for
	for(int y=0;y<h+ex*2;y++)
		for (int x=0;x<w+ex*2;x++)
		{

			int ii=y*(w+2*ex)+x;

			if(type[ii]==2)//outside
			{
				Vec3f q,p,v;

				q[0]=x-ex;
				q[1]=y-ex;
				p=q;
				v=BilineaGetColor_clamp<Vec3f,Vec3f>(_vector,p[0],p[1]);

				float alpha=0.8;

				for(int i=0;i<20;i++)
				{
					p=q+v*sign;
					v=alpha*BilineaGetColor_clamp<Vec3f,Vec3f>(_vector,p[0],p[1])+(1-alpha)*v;
				}

				q=p+v*sign;
				if(q[0]>=0&&q[1]>=0&&q[0]<w&&q[1]<h)
				{
					Vec4b rgba=BilineaGetColor_clamp<Vec4b,Vec4f>(*image,q[0],q[1]);
					if(rgba[3]==0)
						extends.at<Vec4b>(y,x)=rgba;
					else
						extends.at<Vec4b>(y,x)=Vec4b(255,0,255,0);
				}
				else
					extends.at<Vec4b>(y,x)=Vec4b(255,0,255,0);
			}
		}


	return size;
}
示例#7
0
void CPoissonExt::poissonExtend_cuda(cv::Mat &dst,int size)
{

	cv::Mat gx=Mat::zeros(h+2*ex,w+2*ex,CV_32FC4);
	cv::Mat gy=Mat::zeros(h+2*ex,w+2*ex,CV_32FC4);

	#pragma omp parallel for
		for(int y=0;y<h+ex*2;y++)
			for (int x=0;x<w+ex*2;x++)
			{
				if(type[y*(w+2*ex)+x]>1)
				{
					Vec4f BGRA0;
					Vec4f BGRA1;
					BGRA1=dst.at<Vec4b>(y,x);

					if(x>0)
					{
						if(type[y*(w+2*ex)+x-1]>1)
						{
							BGRA0=dst.at<Vec4b>(y,x-1);

							if(BGRA0!=Vec4f(255,0,255,0)&&BGRA1!=Vec4f(255,0,255,0))
								gx.at<Vec4f>(y,x)=BGRA1-BGRA0;

						}
					}

					if(y>0)
					{
						if(type[(y-1)*(w+2*ex)+x]>1)
						{
							BGRA0=dst.at<Vec4b>(y-1,x);

							if(BGRA0!=Vec4f(255,0,255)&&BGRA1!=Vec4f(255,0,255))
								gy.at<Vec4f>(y,x)=BGRA1-BGRA0;
						}
					}
				}

			}


			//matrix
			cusp::csr_matrix<int,float,cusp::host_memory> A(size,size,5*size-w*2-h*2);
			cusp::array1d<float, cusp::host_memory> X0(A.num_rows, 0);
			cusp::array1d<float, cusp::host_memory> B0(A.num_rows, 0);
			cusp::array1d<float, cusp::host_memory> X1(A.num_rows, 0);
			cusp::array1d<float, cusp::host_memory> B1(A.num_rows, 0);
			cusp::array1d<float, cusp::host_memory> X2(A.num_rows, 0);
			cusp::array1d<float, cusp::host_memory> B2(A.num_rows, 0);
		//	cusp::array1d<float, cusp::host_memory> X3(A.num_rows, 0);
		//	cusp::array1d<float, cusp::host_memory> B3(A.num_rows, 0);
			int nNonZeros=0;
			A.row_offsets[0]=0;


			Vec4f BGRA;
			for(int y=0;y<h+ex*2;y++)
				for (int x=0;x<w+ex*2;x++)
				{
					float a[5];
					a[0]=a[1]=a[2]=a[3]=a[4]=0.0f;
					int ii=y*(w+2*ex)+x;

					switch(type[ii])
					{
					case 0://inside
						break;
					case 1://boundary
						a[2]+=1.0f;
						BGRA=dst.at<Vec4b>(y,x);
						B0[index[ii]]+=BGRA[0];
						B1[index[ii]]+=BGRA[1];
						B2[index[ii]]+=BGRA[2];
					//	B3[index[ii]]+=BGRA[3];

					case 2://outside
						if(y-1>=0&&type[ii-(w+2*ex)]>0)
						{
							a[2]+=1.0f;
							a[0]-=1.0f;
							BGRA=gy.at<Vec4f>(y,x);
							B0[index[ii]]+=BGRA[0];
							B1[index[ii]]+=BGRA[1];
							B2[index[ii]]+=BGRA[2];
						//	B3[index[ii]]+=BGRA[3];
						}
						if(x-1>=0&&type[ii-1]>0)
						{
							a[2]+=1.0f;
							a[1]-=1.0f;
							BGRA=gx.at<Vec4f>(y,x);
							B0[index[ii]]+=BGRA[0];
							B1[index[ii]]+=BGRA[1];
							B2[index[ii]]+=BGRA[2];
						//	B3[index[ii]]+=BGRA[3];
						}
						if(x+1<w+2*ex&&type[ii+1]>0)
						{
							a[2]+=1.0f;
							a[3]-=1.0f;
							BGRA=gx.at<Vec4f>(y,x+1);
							B0[index[ii]]-=BGRA[0];
							B1[index[ii]]-=BGRA[1];
							B2[index[ii]]-=BGRA[2];
						//	B3[index[ii]]+=BGRA[3];
						}
						if(y+1<h+2*ex&&type[ii+(w+2*ex)]>0)
						{
							a[2]+=1.0f;
							a[4]-=1.0f;
							BGRA=gy.at<Vec4f>(y+1,x);
							B0[index[ii]]-=BGRA[0];
							B1[index[ii]]-=BGRA[1];
							B2[index[ii]]-=BGRA[2];
						//	B3[index[ii]]+=BGRA[3];
						}


						//put into A
						if(a[0]!=0)
						{
							A.values[nNonZeros]=a[0];
							A.column_indices[nNonZeros]=index[ii-(w+2*ex)];
							nNonZeros++;
						}
						if(a[1]!=0)
						{
							A.values[nNonZeros]=a[1];
							A.column_indices[nNonZeros]=index[ii-1];
							nNonZeros++;
						}
						if(a[2]!=0)
						{
							A.values[nNonZeros]=a[2];
							A.column_indices[nNonZeros]=index[ii];
							nNonZeros++;
						}
						if(a[3]!=0)
						{
							A.values[nNonZeros]=a[3];
							A.column_indices[nNonZeros]=index[ii+1];
							nNonZeros++;
						}
						if(a[4]!=0)
						{
							A.values[nNonZeros]=a[4];
							A.column_indices[nNonZeros]=index[ii+(w+2*ex)];
							nNonZeros++;
						}
						A.row_offsets[index[ii]+1]=nNonZeros;

						break;
					}
				}

				//SOLVER;
				solve(A,B0,X0);
				solve(A,B1,X1);
				solve(A,B2,X2);
			//	solve(A,B3,X3);

				//paste
				#pragma omp parallel for
				for(int y=0;y<h+ex*2;y++)
					for (int x=0;x<w+ex*2;x++)
					{
						int ii=y*(w+2*ex)+x;
						if(type[ii]>0)
						{

							int B=MIN(MAX(X0[index[ii]],0),255);
							int G=MIN(MAX(X1[index[ii]],0),255);
							int R=MIN(MAX(X2[index[ii]],0),255);
							int A=0;
							dst.at<Vec4b>(y,x)=Vec4b(B,G,R,A);
						}
					}

}
示例#8
0
void CPoissonExt::poissonExtend(cv::Mat &dst,int size)
{

	cv::Mat gx=Mat::zeros(h+2*ex,w+2*ex,CV_32FC4);
	cv::Mat gy=Mat::zeros(h+2*ex,w+2*ex,CV_32FC4);

	#pragma omp parallel for
		for(int y=0;y<h+ex*2;y++)
			for (int x=0;x<w+ex*2;x++)
			{
				if(type[y*(w+2*ex)+x]>1)
				{
					Vec4f BGRA0;
					Vec4f BGRA1;
					BGRA1=dst.at<Vec4b>(y,x);

					if(x>0)
					{
						if(type[y*(w+2*ex)+x-1]>1)
						{
							BGRA0=dst.at<Vec4b>(y,x-1);

							if(BGRA0!=Vec4f(255,0,255,0)&&BGRA1!=Vec4f(255,0,255,0))
								gx.at<Vec4f>(y,x)=BGRA1-BGRA0;
						}
					}

					if(y>0)
					{
						if(type[(y-1)*(w+2*ex)+x]>1)
						{
							BGRA0=dst.at<Vec4b>(y-1,x);

							if(BGRA0!=Vec4f(255,0,255,0)&&BGRA1!=Vec4f(255,0,255,0))
								gy.at<Vec4f>(y,x)=BGRA1-BGRA0;
						}
					}
				}

			}
			//matrix
			float *A=new float[5*size];
			 _INTEGER_t *columns=new  _INTEGER_t[5*size];
			 _INTEGER_t *rowindex=new  _INTEGER_t[size+1];
			float *B0=new float[size];
			float *B1=new float[size];
			float *B2=new float[size];
			float *B3=new float[size];
			float *X0=new float[size];
			float *X1=new float[size];
			float *X2=new float[size];
			//float *X3=new float[size];
			_INTEGER_t  nNonZeros=0;

			memset(A,0,5*size*sizeof(float));
			memset(columns,0,5*size*sizeof(int));
			memset(rowindex,0,(size+1)*sizeof(int));
			memset(B0,0,size*sizeof(float));
			memset(B1,0,size*sizeof(float));
			memset(B2,0,size*sizeof(float));
			memset(B3,0,size*sizeof(float));
			memset(X0,0,size*sizeof(float));
			memset(X1,0,size*sizeof(float));
			memset(X2,0,size*sizeof(float));
			//memset(X3,0,size*sizeof(float));

			Vec4f BGRA;
			for(int y=0;y<h+ex*2;y++)
				for (int x=0;x<w+ex*2;x++)
				{
					float a[5];
					a[0]=a[1]=a[2]=a[3]=a[4]=0.0f;
					int ii=y*(w+2*ex)+x;

					switch(type[ii])
					{
					case 0://inside
						break;
					case 1://boundary
						a[2]+=1.0f;
						BGRA=dst.at<Vec4b>(y,x);
						B0[index[ii]]+=BGRA[0];
						B1[index[ii]]+=BGRA[1];
						B2[index[ii]]+=BGRA[2];
						//B3[index[ii]]+=BGRA[3];

					case 2://outside
						if(y-1>=0&&type[ii-(w+2*ex)]>0)
						{
							a[2]+=1.0f;
							a[0]-=1.0f;
							BGRA=gy.at<Vec4f>(y,x);
							B0[index[ii]]+=BGRA[0];
							B1[index[ii]]+=BGRA[1];
							B2[index[ii]]+=BGRA[2];
							//B3[index[ii]]+=BGRA[3];
						}
						if(x-1>=0&&type[ii-1]>0)
						{
							a[2]+=1.0f;
							a[1]-=1.0f;
							BGRA=gx.at<Vec4f>(y,x);
							B0[index[ii]]+=BGRA[0];
							B1[index[ii]]+=BGRA[1];
							B2[index[ii]]+=BGRA[2];
							//B3[index[ii]]+=BGRA[3];
						}
						if(x+1<w+2*ex&&type[ii+1]>0)
						{
							a[2]+=1.0f;
							a[3]-=1.0f;
							BGRA=gx.at<Vec4f>(y,x+1);
							B0[index[ii]]-=BGRA[0];
							B1[index[ii]]-=BGRA[1];
							B2[index[ii]]-=BGRA[2];
							//B3[index[ii]]-=BGRA[3];
						}
						if(y+1<h+2*ex&&type[ii+(w+2*ex)]>0)
						{
							a[2]+=1.0f;
							a[4]-=1.0f;
							BGRA=gy.at<Vec4f>(y+1,x);
							B0[index[ii]]-=BGRA[0];
							B1[index[ii]]-=BGRA[1];
							B2[index[ii]]-=BGRA[2];
							//B3[index[ii]]-=BGRA[3];
						}

						//put into A
						if(a[0]!=0)
						{
							A[nNonZeros]=a[0];
							columns[nNonZeros]=index[ii-(w+2*ex)];
							nNonZeros++;
						}
						if(a[1]!=0)
						{
							A[nNonZeros]=a[1];
							columns[nNonZeros]=index[ii-1];
							nNonZeros++;
						}
						if(a[2]!=0)
						{
							A[nNonZeros]=a[2];
							columns[nNonZeros]=index[ii];
							nNonZeros++;
						}
						if(a[3]!=0)
						{
							A[nNonZeros]=a[3];
							columns[nNonZeros]=index[ii+1];
							nNonZeros++;
						}
						if(a[4]!=0)
						{
							A[nNonZeros]=a[4];
							columns[nNonZeros]=index[ii+(w+2*ex)];
							nNonZeros++;
						}
						rowindex[index[ii]+1]=nNonZeros;

						break;
					}
				}



				//SOLVER
				_INTEGER_t error;
				_MKL_DSS_HANDLE_t solver;
				_INTEGER_t opt=MKL_DSS_MSG_LVL_WARNING + MKL_DSS_TERM_LVL_ERROR + MKL_DSS_SINGLE_PRECISION + MKL_DSS_ZERO_BASED_INDEXING;
				_INTEGER_t sym=MKL_DSS_NON_SYMMETRIC;
				_INTEGER_t typ=MKL_DSS_POSITIVE_DEFINITE;
				_INTEGER_t ord=MKL_DSS_AUTO_ORDER;
				_INTEGER_t sov=MKL_DSS_DEFAULTS;
				 _INTEGER_t nRhs = 1;
				_INTEGER_t size_l=size;

				error= dss_create(solver, opt);
				error = dss_define_structure(solver,sym, rowindex, size_l, size_l,columns, nNonZeros);
				error = dss_reorder( solver,ord, 0);
				error = dss_factor_real( solver, typ, A );
				error = dss_solve_real( solver, sov, B0, nRhs, X0 );
				error = dss_solve_real( solver, sov, B1, nRhs, X1 );
				error = dss_solve_real( solver, sov, B2, nRhs, X2 );
				//error = dss_solve_real( solver, sov, B3, nRhs, X3 );
				error = dss_delete( solver, opt );


				//paste
				#pragma omp parallel for
				for(int y=0;y<h+ex*2;y++)
					for (int x=0;x<w+ex*2;x++)
					{
						int ii=y*(w+2*ex)+x;
						if(type[ii]>0)
						{
							int B=MIN(MAX(X0[index[ii]],0),255);
							int G=MIN(MAX(X1[index[ii]],0),255);
							int R=MIN(MAX(X2[index[ii]],0),255);
							int A=0;
							dst.at<Vec4b>(y,x)=Vec4b(B,G,R,A);

						}
					}


					delete[] A;
					delete[] B0;
					delete[] B1;
					delete[] B2;
					delete[] B3;
					delete[] X0;
					delete[] X1;
					delete[] X2;
					//delete[] X3;
					delete[] columns;
					delete[] rowindex;

}