FPGA与OPENCV的联合仿真

2023-05-16

对于初学者来说,图像处理行业,最佳仿真方式:FPGA+OPENCV,因为OPENCV适合商业化,适合自己写算法。

1)中间交互数据介质——txt文档

2)fpga写txt文档

  reg clk = 0;
 initial begin 
 forever #5 clk = ~clk;
 end
 
 reg RamWea = 0;
  reg Rden = 0;
 initial begin 
 #102; RamWea=1;
 #2560;RamWea=0;
 
 #1000; Rden = 1;
 #655360;Rden = 0;
 
 end
 
 reg [7:0] RamAddra=0;
always @ ( posedge clk ) 
begin  
if( RamWea ) RamAddra <= RamAddra + 1'b1;
else RamAddra <= 8'b0;
end
 
wire [7:0] RamDina = RamAddra;
 
 reg  [7 : 0] RdAddrb = 0;
always @ ( posedge clk ) 
begin  
if( Rden ) RdAddrb <= RdAddrb + 1'b1;
else RdAddrb <= 8'b0;
end

 wire [7 : 0] RdDoutb;
 
 
 blkram_8x256 blkram_8x256 (
  .clka             (clk),    // input wire clka
  .wea              (RamWea),      // input wire [0 : 0] wea
  .addra            (RamAddra),  // input wire [7 : 0] addra
  .dina             (RamDina),    // input wire [7 : 0] dina
  .clkb             (clk),    // input wire clkb
  .addrb            (RdAddrb),  // input wire [7 : 0] addrb
  .doutb            (RdDoutb)  // output wire [7 : 0] doutb
);


integer file_out;
initial
begin
    file_out = $fopen("E:\\CANNY\\CANNY\\CANNY.sim\\out_file0.txt");
    if (!file_out) 
    begin
        $finish;
    end
end            


reg RdenD1 = 0;
reg RdenD2 = 0;
always @ (posedge clk) 
begin  
RdenD1 <= Rden;
RdenD2 <= RdenD1;
end


always @ (posedge clk) 
begin  
    if( RdenD1 )
        $fwrite(file_out," %d",RdDoutb) ;//写入文件,在%d前加入一个空格,效果就是,个位数前有3个空格,两位数前两个空格,三位数前1个空格
end


always @ (posedge clk) 
begin  
    if( ~RdenD1 & RdenD2 )
       $fclose(file_out);
end

 

3)FPGA读取txt文档

 reg clk = 0;
 initial begin 
 forever #5 clk = ~clk;
 end
 
reg [7:0] din;
reg [7:0]data_sin[160:0];  
integer i;
    initial  
        begin  
            i=0;
            begin  
            $readmemh("E:\\CANNY\\CANNY\\CANNY.sim\\out_file0.txt",data_sin,0,160);  //0为起始地址,160为中止地址,readmemh为以十六进制读取,必须保证文本中是十六进制
            //存在一行每个用空格隔开,跟分行存,输出结果是一样的
            end  
            forever
            begin
                @(posedge clk)
                    begin
                        i <= i+1;
                        din <= data_sin[i];
                    end
            end
        end 

 

4)OPENCV读txt

FPGA以十进制%d写入的数据“1”,OPENCV读取时,使用fgets读取,读取的数据个数是以字符为形式读取,包括空格也算一个字符,“1”读取后,以%d显示的话,显示的是“1”的ASC码值,以%c显示才显示为“1”.
函数原型:char *fgets(char *str, int n, FILE *stream); 其从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,遇到空格不停止;

// for filelisting
#include <stdio.h>
#include <io.h>
// for fileoutput
#include <string>
#include <fstream>
#include <sstream>
#include<iostream>
using namespace std;
#define IMAGE_SIZE 256*256
#define IMAGE_WIDTH 256
#define IMAGE_HEIGHT 256
#define MAX_LINE 4*IMAGE_SIZE+1   //+1是因为最后一个字符不会读取
int main()
{
	char buf[MAX_LINE];  /*缓冲区*/
	FILE *fp;            /*文件指针*/
	int len;             /*行字符个数*/
	if ((fp = fopen("E:\\CANNY\\CANNY\\CANNY.sim\\out_file0.txt", "r")) == NULL)
	{
		perror("fail to read");
		exit(1);
	}
		if (fgets(buf, MAX_LINE, fp) != NULL)
	{
		len = strlen(buf); /*从指定的流 stream 读取一行,并把它存储在str所指向的字符串内。当读取(n - 1)个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止*/
		printf(":::::::%d\n", len);
		/*for (int i = 0; i < len; i++)
		{
			printf("%c\n", buf[i]);
		}*/
	}

	int image[IMAGE_SIZE];
	int CombData;
	for (int i = 0; i < len; i++)
	{
		int j = i % 4;
		int k = i / 4;
		int hundred, ten, unit;
		if (j == 1)
		{ 
			if (buf[i] == 32) hundred = 0;//空格
			else hundred = buf[i] - 48; 
			//printf("hundred:%d\n", hundred); 
		}
		else if (j == 2) 
		{ 
			if (buf[i] == 32) ten = 0;
			else ten = buf[i] - 48;
			//printf("ten:%d\n", ten);
		}
		else if (j == 3)
		{
			unit = buf[i] - 48;
			//printf("unit:%d\n", unit);
			CombData = hundred * 100 + ten * 10 + unit;
			image[k] = CombData;
		}
	}
	

	//for (int i = 0; i < 10; i++)
	//{
	//	printf("%d\n", image[i]);
	//}

	#define IMAGE_WIDTH 256
	#define IMAGE_HEIGHT 256


	Mat ImageToShow = Mat(IMAGE_HEIGHT, IMAGE_WIDTH, CV_8UC1);

	for(int i=0;i<IMAGE_HEIGHT;i++)
		for (int j = 0; j < IMAGE_WIDTH; j++)
		{
			ImageToShow.at<uchar>(i, j) = image[i*IMAGE_WIDTH + j];
		}
	imshow("原始图", ImageToShow);
	imwrite("E:\\CANNY\\CANNY\\CANNY.sim\\output.bmp", ImageToShow);
	waitKey();

}

 

5)OPENCV写txt

	char buf[MAX_LINE];  /*缓冲区*/
	FILE *fp;            /*文件指针*/
	int len;             /*行字符个数*/
	if ((fp = fopen("E:\\CANNY\\CANNY\\CANNY.sim\\out_file0.txt", "w")) == NULL)
	{
		perror("fail to read");
		exit(1);
	}
	char name[10] = { 'n1' ,'n2' , 'n3' , 'n4' , 'n5' , 'n6' , 'n7' , 'n8' , 'n9' , '\0'};
	fputs(name, fp);
	return 0;

写入的也是以单个字符形式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FPGA与OPENCV的联合仿真 的相关文章

  • 变形:Opencv 使用 Visual Studio 将图像显示到曲面屏幕

    我正在尝试使用 opencv API 来扭曲图像 以便将其显示到曲面屏幕上 我已经浏览了opencv中提供的翘曲apihere http docs opencv org 2 4 modules stitching doc warpers h
  • ECC 导致多光谱图像的图像对齐失败

    我正在尝试将 RGB 图像与 IR 图像 单通道 对齐 目标是创建 4 通道图像 R G B IR 为了做到这一点 我正在使用cv2 findTransformECC如中所述这个非常简洁的指南 https learnopencv com i
  • 使用 K 均值聚类 OpenCV 进行交通标志分割

    I used K Means Clustering to perform segmentation on this traffic sign as shown below 这些是我的代码 读取图像并模糊 img cv imread 000
  • 检测骰子的上侧

    是否可以检测骰子的上面 虽然从顶部看这将是一项简单的任务 但从许多角度来看 可以看到多个侧面 Here is an example of a dice feel free to take your own pictures 您通常想知道自己
  • OpenCV非旋转图像拼接

    我正在 OpenCV 中进行图像拼接 从不同位置拍摄平面场景的照片并尝试构图全景图 我修改了缝合示例以满足我的需要 openCV 拼接管道的问题是 它假设相机纯粹旋转 但对我来说情况并非如此 当拍摄的照片与场景完全正交时 没有相机旋转 只是
  • 从单应性估计 R/T

    我一直在尝试计算 2 个图像中的特征 然后将这些特征传递回CameraParams R没有运气 特征已成功计算并匹配 但是问题是将它们传递回R t 我明白你必须分解Homography为了使这一点成为可能 我已经使用如下方法完成了 http
  • `opencv.android.JavaCameraView` 和 `opencv.android.NativeCameraView` 有什么区别

    正如主题中所述 有什么区别opencv android JavaCameraView and opencv android NativeCameraView 与其他主要优点相比 有哪些优点可以提供更多选择 来自OpenCV 文档 http
  • Opencv - 找不到头文件

    我正在尝试使用 opencv 开始开发 问题是 到目前为止我几乎无法设置 opencv 因为我找不到它的头文件 我对此主题进行了一些研究 但没有一个真正有帮助 下面是一些链接 opencv2 包含文件在哪里 https stackoverf
  • 如何将 opencv mat 图像转换为 gdi 位图

    我想将 openCV Mat 文件转换为 GDI 位图图像 我找不到任何有关如何执行此操作的信息 我认为没有直接的方法可以做到这一点 但我希望它不涉及将其写入文件并读回 http opencv users 1802565 n2 nabble
  • 将线性数组转换为二维矩阵

    我有一个浮点指针 数组 它代表一个图像 它的元素计数和索引具有宽度 高度 图像不像矩阵 其原点位于左上角 相反 它的原点位于左下角 就像在笛卡尔坐标系中一样 达到最大宽度后 它从左侧开始下一行 所以我想有效地将 这个数组转换为二维矩阵 可选
  • 在 Android 中使用 OpenCV 查找图像匹配

    我正在尝试构建一个 Android 应用程序 该应用程序可以比较设备相机拍摄的照片 以在一组图像中找到匹配项 我已经在 Android Studio 上配置了 OpenCV 但仅此而已 有人可以通过链接到资源或建议教程来提供帮助吗 Open
  • OpenCV Android - 无法解析相应的JNI函数

    我正在尝试按照此处概述的本教程使用 Opencv 设置 Android Studio https www youtube com watch v OTw GIQNbD8 https www youtube com watch v OTw G
  • 对同色像素块的边界进行着色

    我有一张有 5 种不同颜色的图像 在这种情况下 随机生成 w h 40 27 img Image new RGB w h pixels img load available colors r 255 13 18 b 72 64 255 y
  • ValueError:当数组不是序列时设置带有序列的数组元素

    您好 此代码旨在存储使用 open cv 绘制的矩形的坐标 并将结果编译为单个图像 import numpy as np import cv2 im cv2 imread 1 jpg im3 im copy gray cv2 cvtColo
  • 使用 SURF 在检测到的对象周围绘制矩形

    我正在尝试从涉及冲浪检测器的以下代码中检测对象 我不想绘制匹配项 我想在检测到的对象周围绘制一个矩形 但不知何故我无法获得正确的单应性 请任何人指出在哪里我走错了 include
  • 使用 OpenCV 和 Python 叠加两个图像而不丢失颜色强度

    如何叠加两个图像而不损失两个图像的颜色强度 我有图像1和图像2 2 我尝试使用 0 5 alpha 和 beta 但它给我的合并图像的颜色强度只有一半 dst cv2 addWeighted img1 0 5 img2 0 5 0 但是当我
  • Android API人脸检测与OpenCV/JavaCV人脸检测

    我在 Android 设备上使用了本地 Android 人脸检测 但它似乎很慢 而且我不太确定其可靠性 我还使用了 OpenCV 的人脸检测 但仅限于 PC 而不是 Android 设备 对于 Android 我猜我必须使用 JavaCV
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • Python 中的 Lanczos 插值与 2D 图像

    我尝试重新缩放 2D 图像 灰度 图像大小为 256x256 所需输出为 224x224 像素值范围从 0 到 1300 我尝试了两种使用 Lanczos 插值来重新调整它们的方法 首先使用PIL图像 import numpy as np
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以

随机推荐