C++ 如何映射2048*2048的图像?

C++ 如何映射2048*2048的图像?,c++,opencv,image-processing,cuda,C++,Opencv,Image Processing,Cuda,我正在用Cuda C做一个分形,我已经为1024*1024的图像做了我的程序,但是我想要一个更大的2048*2048的图像,关于图像映射如何帮助我合并我的两个代码,1024*1024,我想做什么 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> #include <cuda.h> #include <iostr

我正在用Cuda C做一个分形,我已经为1024*1024的图像做了我的程序,但是我想要一个更大的2048*2048的图像,关于图像映射如何帮助我合并我的两个代码,1024*1024,我想做什么

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <cuda.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctime>
#define MAX_ITER 5000
#define N 1024
#define BLOCKS 32
#define THREAD 1
using namespace cv;
using namespace std;
__global__ void mul(unsigned char *imagen){
int i=blockIdx.y*gridDim.x+blockIdx.x;
int j=threadIdx.y*blockDim.x+threadIdx.x;   
    double x,y,a,b,xnew,ynew,sq;
    double iter;
    iter=0;
        x=0;
        y=0;
        a=((3.0/(N))*j-2);
        b=((2.0/(N))*i-1);
        sq=abs(sqrt(pow(x,2)+pow(y,2)));
        while((sq<2)&&(iter<MAX_ITER))
        {
            xnew=((x*x)-(y*y))+a;
            ynew=(2*x*y)+b;
    x=xnew;
            y=ynew;       
    sq=abs(sqrt(pow(x,2)+pow(y,2)));
            iter=iter+1;        
        }
        if(iter==MAX_ITER)
        {
            imagen[i*(N)+j]=255;
        }
        else
        {
            imagen[i*(N)+j]=0;
        }
}
int main(){
dim3 bloques (32,32);
dim3 threads(32,32);
unsigned char *matriz_a;
unsigned char *matriz_dev_a;

matriz_a = (unsigned char *)malloc(sizeof(unsigned char) * N*N);
cudaMalloc((void **)&matriz_dev_a, N*N*sizeof(unsigned char));
cudaMemcpy(matriz_dev_a, matriz_a, sizeof(unsigned char) *N*N, cudaMemcpyHostToDevice);
/**************************************************************/
mul<<<bloques, threads>>>(matriz_dev_a);
cudaMemcpy(matriz_a, matriz_dev_a, sizeof(unsigned char) *N*N, cudaMemcpyDeviceToHost);
/**************************************************************************/
/************************************************************************/
/***********************************************************************/
const cv::Mat img(cv::Size(N, N), CV_8U, matriz_a);
cv::namedWindow("foobar");
cv::imshow("foobar", img);
cv::waitKey(0);
free(matriz_a);
cudaFree(matriz_dev_a);
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义最大ITER 5000
#定义n1024
#定义块32
#定义线程1
使用名称空间cv;
使用名称空间std;
__全局无效mul(无符号字符*imagen){
inti=blockIdx.y*gridDim.x+blockIdx.x;
int j=threadIdx.y*blockDim.x+threadIdx.x;
双x,y,a,b,xnew,ynew,sq;
双iter;
iter=0;
x=0;
y=0;
a=((3.0/(N))*j-2);
b=((2.0/(N))*i-1);
sq=abs(sqrt(功率(x,2)+功率(y,2));

而((sq当前代码有两个问题

  • 代码是不可伸缩的,因为块的数量是固定的
  • 内核内的索引不正确。全局索引
    j
    不随块数的变化而缩放
  • 这些问题可以通过以下方式解决:

    使块的数量动态化,即取决于输入数据的大小:

    dim3 threads(32,32);
    dim3 bloques;
    bloques.x = (N + threads.x - 1)/threads.x;
    bloques.y = (N + threads.y - 1)/threads.y;
    
    标准化内核内部的索引:

    int i= blockIdx.y * blockDim.y + threadIdx.y;
    int j= blockIdx.x * blockDim.x + threadIdx.x;
    

    修改后的代码适用于2048 x 2048的分形尺寸。

    当前代码存在两个问题

  • 代码是不可伸缩的,因为块的数量是固定的
  • 内核内的索引不正确。全局索引
    j
    不随块数的变化而缩放
  • 这些问题可以通过以下方式解决:

    使块的数量动态化,即取决于输入数据的大小:

    dim3 threads(32,32);
    dim3 bloques;
    bloques.x = (N + threads.x - 1)/threads.x;
    bloques.y = (N + threads.y - 1)/threads.y;
    
    标准化内核内部的索引:

    int i= blockIdx.y * blockDim.y + threadIdx.y;
    int j= blockIdx.x * blockDim.x + threadIdx.x;
    

    修改后的代码在分形尺寸2048 x 2048上运行良好。

    哦,谢谢,我想我会学习更多,我会让它工作的谢谢!!哦,谢谢,我想我会学习更多,我会让它工作的谢谢!!