日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

halcon旋转后坐标_基于FPGA的图像旋转设计

發布時間:2025/4/5 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 halcon旋转后坐标_基于FPGA的图像旋转设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

該項目是參加2019屆全國大學生FPGA大賽的作品,系統主要實現視頻任意角度旋轉。利用國產的紫光同創公司的FPGA芯片作為開發平臺,視頻圖像從攝像頭實時采集,經過算法旋轉后,通過hdmi接口顯示。該項目最終晉級決賽,并獲得紫光同創企業特別獎。

一,圖像旋轉原理

圖像旋轉是指圖像按照某個位置轉動一定角度的過程,旋轉中圖像仍保持這原始尺寸。圖像旋轉后圖像的水平對稱軸、垂直對稱軸及中心坐標原點都可能會發生變換,因此需要對圖像旋轉中的坐標進行相應轉換。

如圖,原圖像經過順時針旋轉角度為 θ?后,源圖像的坐標為?P0 ( Xo, Yo ) 的點移動到了 P1(X1, Y1)。

經過推導,可以得到上述的 P0 和P1 的坐標變換關系式。

二,MATLAB仿真

方案一:【正向預設】從原圖映射到目標圖像

在此方案中,實現代碼的方式是正向的思路,將原圖中的像素點的坐標進行坐標的旋轉,然后直接幅值到輸出的圖像中,此方案旨在找到輸入坐標與輸出坐標之間的代數對應關系。

在該方法中,首先將原始坐標以及目標坐標放入了極坐標中,并且通過在極坐標中的關系,找到了同時滿足X0,Y0,X1,Y1四個參量的方程組,以此來解出對應的坐標關系,并以此為基礎得到了輸入與輸出之間的矩陣運算關系如下:

Matlab代碼實現如下:

clear?allclc %?讀入圖片im?=?imread('1.jpg');figure;imshow(im);?%?求出旋轉矩陣a = 40 / 180 * pi;R?=?[cos(a),?-sin(a);?sin(a),?cos(a)];?%?求出圖片大小?ch為通道數?h為高度?w為寬度sz?=?size(im);h?=?sz(1);w?=?sz(2);ch?=?sz(3);c?=?[h;?w]?/?2; %?初始化結果圖像im2 = uint8(zeros(h, w, 3));for?k?=?1:ch????for?i?=?1:h???????for?j?=?1:w??????????p?=?[i;?j];??????????%?round為四舍五入??????????pp?=?round(R*(p-c)+c); if (pp(1) >= 1 && pp(1) <= h && pp(2) >= 1 && pp(2) <= w)??????????????im2(pp(1),?pp(2),?k)?=?im(i,?j,?k);??????????end???????end????endend?%?顯示圖像figure;imshow(im2);

但在實際的測試中發現,這種方法所旋轉得到的圖像有著較為嚴重的失真現象,具體情況如下圖所示:??

原圖

旋轉后的圖像

很明顯可以看到,在旋轉之后這兩張圖片出現了較大的差別,首先是原圖像被裁減了,其次是目標圖像中有較多的瑕點(雜點)。究其原因在于,從原圖旋轉后得到的目標圖像的像素位置在原圖中找不到。另外就是邊緣被裁剪的問題,由于在這個方案中約束了顯示區域,因此在旋轉的過程中,部分像素點就會由于超出邊界而被裁剪。針對以上的兩個問題,進行了如下改進。

方案二:【逆向預設】從目標圖像映射到原圖

??由于在之前的方案中出現了雜點以及圖像邊緣裁剪的問題,因此在本方案中,我們采用了逆向思維,用目標圖像的坐標去與原圖的坐標進行坐標匹配,若在原圖像中能找到匹配的圖像,就顯示該點旋轉后的點坐標,若在原圖中找不到該點,則不顯示該點,通過這樣就解決了雜點的問題。

??其中,pp為旋轉在后的坐標對應矩陣,在if語句中限定了原圖的區域,用此區域則可以到原圖中的坐標點,以此來排除不在區域中的坐標點,這樣就可以解決雜點的問題。

在這種方案下,坐標的對應關系如下:

MATLAB仿真代碼如下:

clear?allclc?%?讀入圖片im = imread('1.jpg');figure;imshow(im);?%?求出旋轉矩陣a?=?20?/?180?*?pi;R?=?[cos(a),?sin(a);?-sin(a),?cos(a)]; % 求出圖片大小 ch為通道數 h為高度 w為寬度sz?=?size(im);h?=?sz(1);w = sz(2);ch?=?sz(3);c?=?[w;h]?/2;?%?初始化結果圖像im2?=?uint8(zeros(h,?w,?3));for?k?=?1:ch????????????????????%遍歷輸出圖像所有位置的像素????for?i?=?1:h???????for?j?=?1:w??????????p?=?[j;?i];???????????%?p?:輸出圖像的像素坐標??????????%?round為四舍五入????????? pp = round(R*(p-c)+c);????%pp :對應到輸入圖像的像素坐標??????????%逆向進行像素的查找??????????????????if?(pp(1)?>=?1?&&?pp(1)?<=?w?&&?pp(2)?>=?1?&&?pp(2)?<=?h)????????????????im2(i,?j,?k)?=?im(pp(2),?pp(1),?k);????????????end???????end????endend?% 顯示圖像figure;imshow(im2);

這樣,該旋轉后的圖像就有了較好的還原度,達到了相應的題目要求,具體的方案的效果如下圖所示:

????原圖

旋轉后的圖像

如圖所示,相對方案一而言,圖像的效果就好了很多,但圖像邊緣仍然存在邊緣被切割的現象。

方案三:

考慮到未對旋轉后的圖像進行顯示區域的劃分,因此此類旋轉只是對單一像素點的旋轉,然后在原圖像的顯示區域上進行坐標點的重新組合,得到顯示的圖像。在解決的方法的思路上,采用目標顯示區域的重新劃分來解決該問題。

具體思路是,采用原圖像的長寬作為基準,再用坐標轉換的關系,將長和寬轉換到旋轉后的坐標系中,得到目標圖像在旋轉后坐標系中的顯示區域,代碼具體如下:

%?讀入圖片im?=?imread('1.jpg');?figure;imshow(im); %?求出旋轉矩陣a?=?30?/?180?*?pi;R?=?[cos(a),?-sin(a);?sin(a),?cos(a)];R?=?R';?%?求出旋轉矩陣的逆矩陣進行逆向查找?%?計算原圖大小sz?=?size(im);h?=?sz(1);w?=?sz(2);ch?=?sz(3);c1?=?[h;?w]?/?2;?%?計算顯示完整圖像需要的畫布大小hh?=?floor(w*sin(a)+h*cos(a))+1;ww?=?floor(w*cos(a)+h*sin(a))+1;c2?=?[hh;?ww]?/?2;?%?初始化目標畫布im2?=?uint8(ones(hh,?ww,?3)*128);for k = 1:ch????for?i?=?1:hh???????for?j?=?1:ww??????????p?=?[i;?j];??????????pp?=?(R*(p-c2)+c1);??????????mn?=?floor(pp);??????????ab?=?pp?-?mn;??????????a?=?ab(1); b = ab(2);??????????m?=?mn(1);??????????n?=?mn(2);??????????%?線性插值方法 if (pp(1) >= 2 && pp(1) <= h-1 && pp(2) >= 2 && pp(2) <= w-1)?????????????im2(i,?j,?k)?=?(1-a)*(1-b)*im(m,?n,?k)?+?a*(1-b)*im(m+1,?n,?k)...??????????????????????????+?(1-a)*b*im(m,?n,?k)?????+?a*b*im(m,?n,?k);??????????end???????end????endend%?顯示圖像figure;imshow(im2);

這樣,就解決了圖像邊緣被裁剪的問題,是整個圖像得以完整的顯示,實際的效果如下:

原圖

旋轉后的圖像

從圖示的效果可以看出,邊緣區域被裁剪的問題被解決了,但問題是圖片加陰影的區域面積比原圖大很多。

綜合以上三種方案,結合實際需求,由于我們的顯示是在一塊固定大小的屏幕上進行顯示,整個圖像的顯示范圍有限,采用CORDIC算法進行坐標變換產生的延時太大。最終基于處理速度和資源占用的均衡考慮,最終選擇方案二作為我們圖像旋轉的設計方案。

三,旋轉坐標計算

在該設計中,要求圖像擁有0到360的任意角度的旋轉,坐標變換需要角度的正弦和余弦值。

利用matlab生成正余弦表,并將其擴大256倍,打印到文件中。利用得到的正余弦表數值,將其寫入verilog代碼中,生成正余弦查找表。通過輸入角度值來索引其正余弦數值。Matlab生成正余弦列表的代碼如下;

該正弦,余弦通過MATLAB計算得到,并預先儲存到FPGA的片上儲存空間中,在進行坐標變換時,讀取對應角度的正弦,余弦值,進行坐標變換。由于計算得到的正弦和余弦值為浮點數,而FPGA擅長于進行整數運算。故要進行浮點數到整數的轉換,具體的實現方法是,將計算得到的浮點正弦,余弦值乘上 256 后再取整,計算得到的結果于原結果相比被擴大了256倍,而在數字電路中,除法操作可以用移位來進行。結果右移8位即等效于除于256 。

坐標變換的核心代碼如下:

將坐標變換計算模塊封裝為一個子模塊,輸入輸出圖像的坐標和旋轉角度后,即可計算出對應的輸入圖像對應的像素的坐標。然后讀取該坐標的像素值,寫入到旋轉重建的圖像對應的坐標位置即可。

四,效果展示(Results show)

0.原圖 (正常顯示)

1,順時針旋轉22

2,順時針旋轉90?

3,順時針旋轉270?

4,順時針旋轉341?

五,說明

在公眾號對話框回復?FPGA2019?,即可獲得該項目的工程源代碼,詳細的文檔說明,MATLAB仿真代碼。

總結

以上是生活随笔為你收集整理的halcon旋转后坐标_基于FPGA的图像旋转设计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。